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. namespace的作用及用法

    namespace 所谓namespace,是指标识符的可见范围.C++标准库中的所有标识符都被定义在一个名为 std 的namespace 中. 一.<iostream>和<ios ...

  2. Flask - Flask的蓝图(BluePrint)

    目录 Flask - Flask的蓝图(BluePrint) 一. 初始Flask蓝图 进阶Flask蓝图 使用蓝图做一个增删改查 1.使用蓝图进行web应用搭建: 2.使用Flask蓝图,查看学生信 ...

  3. 8.1.1 Connection 对象

    Connect是sqllite3模块中最基本的也是最重要的一个类,其主要方法如下表所示: 方法 说明 execute(sql[,parameters]) 执行一条SQL语句 executemany(s ...

  4. openstack部署工具简介

    个人使用方面DevStack无疑,在可预见的未来时间内,DevStack仍将是众多开发者们的首选安装方式或工具.该方式主要是通过配置参数,执行shell脚本来安装一个OpenStack的开发环境.Gi ...

  5. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  6. [转]使用代码去描述WCF配置文件

    转自:使用代码去描述WCF配置文件 在应用程序部署的时候,WCF客户端因为服务器地址的变化,需要修改程序配置文件的地址URL,手动修改很不方便,还会造成错误,所以尽量把描述WCF配置文件的配置使用代码 ...

  7. 《Android源代码设计模式解析与实战》读书笔记(十八)

    第十八章.代理模式 代理模式也称托付模式,是结构型设计模式之中的一个.是应用广泛的模式之中的一个. 1.定义 为其它对象提供一种代理以控制对这个对象的訪问. 2.使用场景 当无法或不想直接訪问某个对象 ...

  8. Linux内核剖析 之 进程简单介绍

    1.概念 1.1  什么是进程?     进程是程序运行的一个实例.能够看作充分描写叙述程序已经运行到何种程度的数据结构的汇集.     从内核观点看.进程的目的就是担当分配系统资源(CPU时间,内存 ...

  9. postgresql数据库psql控制台操作命令

    登录postgresql数据库控制台 psql 数据库名 登录成功显示 [zpf@kevin ~]$ psql postgres psql (9.4.1) Type "help" ...

  10. iOS7系统iLEX RAT冬青鼠安装教程:无需刷机还原纯净越狱系统

    全网科技 温馨提醒:iLEX RAT和Semi-Restore的作用都是让你的已越狱的设备恢复至越狱的初始状态. 可是要注意无论你是用iLexRAT冬青鼠还是Semi-restore.对于还原来说都存 ...