对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决。比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析。

常用步骤:


第一道题目:Dungeon Master  http://poj.org/problem?id=2251

Input

The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size). 
L is the number of levels making up the dungeon. 
R and C are the number of rows and columns making up the plan of each level. 
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.

Output

Each maze generates one line of output. If it is possible to reach the exit, print a line of the form

Escaped in x minute(s).

where x is replaced by the shortest time it takes to escape. 
If it is not possible to escape, print the line

Trapped!

Sample Input

3 4 5
S....
.###.
.##..
###.# #####
#####
##.##
##... #####
#####
#.###
####E 1 3 3
S##
#E#
### 0 0 0

此题目只要求了求出最短的路径步骤,肯定适合使用广度优先算法来处理,但是如果再要求输出对应最短路径下的具体路径,则只能使用深度优先来处理了。

先来一个广度优先算法的参考代码:

 #include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring> using namespace std; int l,r,c; struct node
{
int i;
int j;
int k;
int s;
}; string road[][];
int visited[**];//i*r*c+j*c+k为索引值 void getroad(int es)
{
int i,j,k;
node first,next;
bool flag=false; for(i=;i<l;i++)
{
for(j=;j<r;j++)
{
for(k=;k<c;k++)
{
if(road[i][j][k] == 'S')//找到初始点,标记
{
first.i=i;
first.j=j;
first.k=k;
first.s=;
flag=true;
break;
}
}
if(flag)
break;
}
if(flag)
break;
} queue<node> q;
q.push(first);
visited[first.i*r*c+first.j*c+first.k]=es; while(!q.empty())
{
first=q.front();
q.pop(); //需要设计上下左右前后6个方向,1维只有上下j左右k,2维以上再添加前后i
//同时需要考虑是否处在边界的情况
next=first;
next.s+=;
int index=; next.j-=;//上
index=next.i*r*c+next.j*c+next.k;
if(next.j>= && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.j>= && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
} next.j+=;//下
index=next.i*r*c+next.j*c+next.k;
//cout<<str[next.i][next.j][next.k]<<endl;
if(next.j<r && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.j<r && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
} next.j-=;//复原 next.k-=;//左
index=next.i*r*c+next.j*c+next.k;
if(next.k>= && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.k>= && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
} next.k+=;//右
index=next.i*r*c+next.j*c+next.k;
if(next.k<c && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.k<c && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
} next.k-=;//复原 if(l>)
{
next.i-=;//前
index=next.i*r*c+next.j*c+next.k;
if(next.i>= && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.i>= && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
} next.i+=;//后
index=next.i*r*c+next.j*c+next.k;
if(next.i<l && road[next.i][next.j][next.k] == '.')
{
if(visited[index] != es)
{
q.push(next);
visited[index]=es;
}
}
if(next.i<l && road[next.i][next.j][next.k] == 'E')
{
cout<<"Escaped in "<<next.s<<" minute(s)."<<endl;
return;
}
}
}
cout<<"Trapped!"<<endl;
} int main()
{
int count=; while(true)
{
cin>>l>>r>>c; if(l== && r== && c==)
break; int i=;
int j=;
string tmp;
for(i=;i<l;i++)
{
for(j=;j<r;j++)
cin>>road[i][j];
getline(cin,tmp);
}
getroad(count); for(i=;i<l;i++)
for(j=;j<r;j++)
road[i][j].clear(); count++;
} return ;
}

题目更改一下,要求输出最短步数,并且输出对应的具体路径。

考虑一下:

[ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)的更多相关文章

  1. [ACM训练] 算法初级 之 搜索算法 之 广度优先算法BFS (POJ 3278+1426+3126+3087+3414)

    BFS算法与树的层次遍历很像,具有明显的层次性,一般都是使用队列来实现的!!! 常用步骤: 1.设置访问标记int visited[N],要覆盖所有的可能访问数据个数,这里设置成int而不是bool, ...

  2. 最近关于ACM训练与算法的总结

            到了大四以后越来越意识到基础知识的重要性,很多高屋建瓴的观点与想法都是建立在坚实的基础之上的, 招式只有在强劲的内力下才能发挥最大的作用,曾经有段时间我有这样的想法:我们出去以后和其他 ...

  3. 寒假的ACM训练(一)

    今天开始ACM训练,选择了刘汝佳的<挑战编程>,暂时算是开始了. 测评的网址: http://www.programming-challenges.com 第一个题目是水题啦.3n+1. ...

  4. 人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)

    搜索算法问题求解 一.需求分析 分别用深度优先.迭代加深.一致代价.A*搜索算法得到从起始点Arad到目标点Bucharest的一条路径,即为罗马尼亚问题的一个解,在求解的过程中记录每种算法得到的解, ...

  5. 2014暑假ACM训练总结

    2014暑假ACM训练总结报告 匆匆之中,一个暑假又过去了,在学校训练的这段日子真的是感觉日子过得好快啊! 时光如箭,日月如梭! 匆忙的学习之中一个暑假就这样结束了,现在就来写一些总结吧,供自己以后阅 ...

  6. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

  7. 广度优先算法(BFS)与深度优先算法(DFS)

    一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...

  8. 必知必会JVM垃圾回收——对象搜索算法与回收算法

    垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作.但是这并不是说程序员不需要了解GC.GC只是Java编程中一项自动化工具,任何一个 ...

  9. 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)

    ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...

随机推荐

  1. Java实现比较版本号

    涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法: 这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使 ...

  2. iOS 编译时处理器架构选择

    先看看主流的ios设备的架构 armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch armv7 iPhone4 iPhone4S armv7s iPhone5 ...

  3. 为WIN8 APP创建置顶desktop应用

    Windows 8: TopMost window   I am working on my next ambitious project “MouseTouch” which is multi to ...

  4. 出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码)

    出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码) 购买后可提供相应的小修改,以及教你使用往这个多列面里再加上按钮功能! 这套源码可作为工作使用,也可用为新手学习AI脚面 ...

  5. tp5 model 的数据自动完成

    auto属性自动完成包含新增和更新操作 namespace app\index\model; use think\Model; class User extends Model { protected ...

  6. 如何搞定IE+google双内核的360浏览器表单自动回填兼容问题

    最近开发中碰到一个关于表单问题,在用户提交表单时候浏览器会提示是否保存帐号 如果点击保存,在退出帐号切换其他帐号时,浏览器会自动为表单填充数据,为了解决这个自动填充问题时, 主要分2个思路来解决,一个 ...

  7. 基于SSM的租赁管理系统0.2_20161225_开发环境

    项目环境搭建 1. 开发环境 Sybase PowerDesigner 15.1.0 + MySQL 5.7.15 + Navicat 11.0.9 + eclipse EE Mars 2.0 + F ...

  8. js将多个方法添加到window对象上的多种方法

    方法一:(最简单也是最笨的方法) window.a = function(){}window.b = function(){}window.c = function(){} 方法二:(利用jq的ext ...

  9. Redis

    1. sds类型 sds为一种抽象数据结构 typedef char *sds;struct sdshdr { // buf 已占用长度int len; // buf 剩余可用长度int free;  ...

  10. Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)

    最近在开发中使用到了UpDown这个控件,但是因为之前没有使用过,所以很不熟悉,于是就编写了一个简单的demo来学习UpDown以及其结合TEdit的用法. 初步的常用功能的简介 目前(2015.08 ...