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. Aizu - 1379 Parallel Lines

    平行直线 题意:给出一些点,这些点两两相连成一条直线,问最多能连成多少条直线. 思路:暴力出奇迹!!记得当时比赛做这道题的时候一直依赖于板子,结果却限制了自己的思路,这得改.dfs直接暴力,但是需要将 ...

  2. [luogu2591 ZJOI2009] 函数

    传送门 Solution 画图找规律.. Code //By Menteur_Hxy #include <cstdio> #define min(a,b) ((a)>(b)?(b): ...

  3. Linux - 用户管理与文件权限

    目录 Linux - 用户管理与文件权限 创建普通用户 切换用户 userdel删除用户 sudo 命令 文件与目录权限 Linux权限的解读 目录权限 查看用户权限的命令 文件权限 修改权限的命令 ...

  4. 洛谷 P2155 BZOJ 2186 codevs 2301 [SDOI2008]沙拉公主的困惑

    题目描述 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的 ...

  5. nyoj_8_一种排序_201311251238

    一种排序 时间限制:3000 ms  |           内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编 ...

  6. war包结构

    一个war包里面必含的两个目录是meta-inf和web-inf文件夹 一个war包里面必含的两个目录是meta-inf和web-inf文件夹 一个war包里面必含的两个目录是meta-inf和web ...

  7. Clojure:通过ZeroMQ推送消息

    通过ZeroMQ的pub/sub模式,我们可以实现发送推送消息的功能.以下为示例代码(入门可参考此文:http://www.cnblogs.com/ilovewindy/p/3984269.html) ...

  8. Java 设计模式—装饰者模式

    在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...

  9. 【JavaScript】正則表達式

    正則表達式,也不是第一次与它见面了.在我们学习ASP.NET视频的时候,验证控件的那个实例中.就有提到过它. 那个时候.都是在控件的属性中自己设置的,用的原理就是正則表達式,当时得感觉就是方便,强大, ...

  10. nginx启动访问

    修改配置文件后,查看配置是否ok 以下是有错误的 以下是ok的 nginx/sbin/nginx -t 启动查询: /usr/local/nginx/sbin/nginx -c /usr/local/ ...