dfs算法是深度搜索算法。从某一节点开始遍历直至到路径底部,如果不是所寻找的,则回溯到上个节点后,再遍历其他路径。不断重复这个过程。一般此过程消耗很大,需要一些优化才能保持算法的高效。

  hdu1010:(奇偶剪枝)

    主要题意是一只小狗为了一块骨头,然后进入迷宫。当它拿起骨头的时候,迷宫开始下沉。小狗才发这迷宫是个陷阱。这迷宫只有一个门,小狗只能在规定时间内跑到到门这里才能顺利出逃。另外,小狗每跑过一块,该块就会下沉。因此不能过早或者过晚到门。(题目挺有意思)

    刚开始刷题时,没有用剪枝,超时了。使用奇偶剪枝+dfs后,可以直接过。奇偶剪枝的内容可以百度。

    

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
/*
'X': a block of wall, which the doggie cannot enter;
'S': the start point of the doggie;
'D': the Door;
'.': an empty block.
*/ int n,m,t;
bool flag = false;
int doorI,doorJ;
char blocks[][];
bool isEnd(int curI,int curJ,int curT)
{
if(flag) return true;
if(curT > t) return true;
if(curT == t)
{
if(curI == doorI && curJ == doorJ)
flag = true;
return true;
}
if(curI < || curJ < || curI >= n || curJ >=m)
return true;
if(blocks[curI][curJ] == 'X') return true;
if(curI==doorI && curJ == doorJ) return true;
return false;
}
void dfs(int curI,int curJ,int curT)
{
if(isEnd(curI,curJ,curT)) return;
char temp = blocks[curI][curJ];
blocks[curI][curJ] = 'X';
dfs(curI-,curJ,curT+);
dfs(curI+,curJ,curT+);
dfs(curI,curJ-,curT+);
dfs(curI,curJ+,curT+);
blocks[curI][curJ] = temp;
} int main()
{
while(~scanf("%d%d%d",&n,&m,&t),n&&m&&t)
{
flag = false;
int startI=,startJ=;
for(int i=;i<n;++i)
{
scanf("%s",blocks[i]);
for(int j=;j<m;++j)
if(blocks[i][j]=='S')
startI = i,startJ = j;
else if(blocks[i][j]=='D')
doorI = i,doorJ = j;
}
//ΌτΦ¦
if(abs(startI-doorI)+abs(startJ-doorJ)> t ||(startI + startJ + doorI + doorJ + t)%)
{
printf("NO\n");
continue;
}
dfs(startI,startJ,);
if(flag) printf("YES\n");
else printf("NO\n");
}
return ;
}

  hdu2553:(简单题)

    N皇后问题,使用dfs一次性把1到10的值算出来,然后直接输出Hash[n]就行了,否则会超时。

 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; int cnt;
int n; //n不大于10
int f[];
int Hash[];
bool isEnd(int curI)
{
for(int i=;i<curI-;++i)
if(f[curI-]==f[i]||
f[curI-]-f[i]==curI-i-||
f[i]-f[curI-]==curI-i-)
return true;
if(curI == n)
{
++cnt;
//注释的是输出代码,可以打开注释,看具体的输出
/*for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
if(f[i] == j) printf("1 ");
else printf("0 ");
}
printf("\n");
}
printf("\n");
*/
return true;
}
return false; }
void dfs(int curI)
{
if(isEnd(curI)) return;
for(int j=;j<n;++j)
{
f[curI] = j;
dfs(curI+);
}
}
int main()
{
for(n=;n<=;++n)
{
cnt = ;
memset(f,,sizeof());
dfs();
Hash[n] = cnt;
}
while(~scanf("%d",&n),n)
{
printf("%d\n",Hash[n]);
}
return ;
}

算法之dfs篇的更多相关文章

  1. 一步步教你轻松学支持向量机SVM算法之案例篇2

    一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...

  2. 一步步教你轻松学支持向量机SVM算法之理论篇1

    一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...

  3. 一步步教你轻松学朴素贝叶斯模型算法Sklearn深度篇3

    一步步教你轻松学朴素贝叶斯深度篇3(白宁超   2018年9月4日14:18:14) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对 ...

  4. 启xin宝app的token算法破解——frida篇(四)

    前两篇文章分析该APP的抓包.的逆向: 启xin宝app的token算法破解--抓包分析篇(一) 启xin宝app的token算法破解--逆向篇(二) 启xin宝app的token算法破解--toke ...

  5. 算法---FaceNet理论学习篇

    FaceNet算法-理论学习篇 @WP20190228 ==============目 录============ 一.LFW数据集简介 二.FaceNet算法简介 FaceNet算法=MTCNN模型 ...

  6. C#算法设计排序篇之04-选择排序(附带动画演示程序)

    选择排序(Selection Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/681 访问. 选择排序是一种简 ...

  7. 图的深度优先遍历算法(DFS)

    搜索算法有很多种,本次文章主要分享图(无向图)的深度优先算法.深度优先算法(DFS)主要是应用于搜索中,早期是在爬虫中使用.其主要的思想有如下: 1.先访问一个节点v,然后标记为已被访问过2.找到第一 ...

  8. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  9. 图的遍历算法:DFS、BFS

    在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...

随机推荐

  1. python 未知

    import timeimport requestsfrom bs4 import BeautifulSoupimport threading def format_str(s): return s. ...

  2. BZOJ 1603 USACO 2008 Oct. 打谷机

    [题解] 水题.. 保存连接方式,按顺序处理即可. #include<cstdio> #include<algorithm> using namespace std; int ...

  3. 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目

    使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致. dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供 ...

  4. 【IntelliJ IDEA】idea上安装Translation插件后,需要AppKey才能生效的解决方案

    使用idea安装的翻译插件translation,但是使用的时候并不友好 无奈,如果想使用翻译软件并且更方便的话,可以如下: 可以选择将translation进行卸载 清除缓存并进行重启 然后再启动之 ...

  5. 赛门铁克通配符SSL证书,一张通配型证书实现全站加密

      赛门铁克通配型SSL证书,验证域名所有权和企业信息,属于企业验证(OV) 级SSL证书,最高支持256位加密.申请通配符SSL证书可以保护相同主域名下无限数量的多个子域名(主机).例如,一个通配符 ...

  6. Java Web学习总结(23)——Distributed Configuration Management Platform(分布式配置管理平台)

    专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务. 主要目标: 部署极其简单:同一个上线包,无须改动配置,即可在 多个环境中(RD/QA/PRODUCTION) 上线 部 ...

  7. Struts2 Action重启偶尔404 偶尔正常

    这是一个痛苦的教训 因想懒省事,复制module.action  到product.action  跟user.action 然后修改代码内容  ,最痛苦的是  还用查找替换功能进行全部文字替换  , ...

  8. Python 3 条件语句

    条件语句:  用于判定,判定是否符合某条件,符合则执行,不符合则不执行该条件所定义的操作. 一步判定:  用于理解不会这样使用. if  1==1:    if条件判定只能出现一次. print(&q ...

  9. noip模拟赛 财富

    题目描述LYK有n个小伙伴.每个小伙伴有一个身高hi.这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在这里的每个人都羡慕比自己身高高的人,而每个人都有一个属性ai表示它对身高的羡慕值.这n ...

  10. 配置JBOSS多实例

    在使用Jbossserver时.非常多情况我们须要配置多个实例,以下为大家介绍JBoss里怎样配置多实例,以Jboss5.1为例介绍. 1.复制${JBOSS_HOME}\server\default ...