[ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决。比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析。
常用步骤:
第一道题目:Dungeon Master http://poj.org/problem?id=2251
Input
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
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)的更多相关文章
- [ACM训练] 算法初级 之 搜索算法 之 广度优先算法BFS (POJ 3278+1426+3126+3087+3414)
BFS算法与树的层次遍历很像,具有明显的层次性,一般都是使用队列来实现的!!! 常用步骤: 1.设置访问标记int visited[N],要覆盖所有的可能访问数据个数,这里设置成int而不是bool, ...
- 最近关于ACM训练与算法的总结
到了大四以后越来越意识到基础知识的重要性,很多高屋建瓴的观点与想法都是建立在坚实的基础之上的, 招式只有在强劲的内力下才能发挥最大的作用,曾经有段时间我有这样的想法:我们出去以后和其他 ...
- 寒假的ACM训练(一)
今天开始ACM训练,选择了刘汝佳的<挑战编程>,暂时算是开始了. 测评的网址: http://www.programming-challenges.com 第一个题目是水题啦.3n+1. ...
- 人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)
搜索算法问题求解 一.需求分析 分别用深度优先.迭代加深.一致代价.A*搜索算法得到从起始点Arad到目标点Bucharest的一条路径,即为罗马尼亚问题的一个解,在求解的过程中记录每种算法得到的解, ...
- 2014暑假ACM训练总结
2014暑假ACM训练总结报告 匆匆之中,一个暑假又过去了,在学校训练的这段日子真的是感觉日子过得好快啊! 时光如箭,日月如梭! 匆忙的学习之中一个暑假就这样结束了,现在就来写一些总结吧,供自己以后阅 ...
- Java与算法之(5) - 老鼠走迷宫(深度优先算法)
小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...
- 广度优先算法(BFS)与深度优先算法(DFS)
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
- 必知必会JVM垃圾回收——对象搜索算法与回收算法
垃圾回收(GC)是JVM的一大杀器,它使程序员可以更高效地专注于程序的开发设计,而不用过多地考虑对象的创建销毁等操作.但是这并不是说程序员不需要了解GC.GC只是Java编程中一项自动化工具,任何一个 ...
- 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)
ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...
随机推荐
- 耿丹CS16-2班第二次作业汇总
-- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...
- BZOJ 3288: Mato矩阵
Description 一个 \(n*n\) 行列式,\((i,j)=gcd(i,j)\) Sol 线性筛. 这道题神奇的筛出来 \(phi\) ... 打表可以发现,一个数会被他所有的因子减掉因子的 ...
- ajax——CORS跨域调用REST API 的常见问题以及前后端的设置
RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...
- 高性能MySQL(五):查询性能优化
当向MySQL 发送一个请求的时候MySQL 到底做了什么? 1.客户端发送一条查询给服务器 2.服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果.否则进入下一阶段 3.服务器端进行 ...
- Python 之旅
Python2 之旅: https://funhacks.net/explore-python/ <Python Cookbook>第三版 PYTHON3 http://pyt ...
- 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]
[题目] 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 二叉树的结点定义如下: C++ Code 123456 struct BinaryTreeNode { int ...
- Angular2 表单
1. 说明 表单是Web程序中的重要组成部分,构建良好以及实用的表单必须解决如下几个问题: (1). 如何跟踪及更新表单的数据状态 (2). 如何进行表单验证 (3). 如何显示表单验证信息 Angu ...
- tp5 model 中的类型转换
类型转换使用 $type 定义 // 保存到数据库的数据会自动转换为相对应的格式class User extends Model { protected $type = [ 'status' => ...
- MongoDB 学习笔记一: 配置
下载MongoDB 下载地址:https://www.mongodb.com/download-center?jmp=nav#community 这里是在windows平台下安装MongoDB, 下载 ...
- 定时器setInterval 开始、暂停、继续!
活不多说,最近写这个定时器,,遇到了一些问题.然后上网百度.避免以后朋友遇到类似问题.贴出代码.... 最主要就是定义全局变量. 下面重要的我红色 标注出来. 批注:如 赋值代码,请给出源码地址.O( ...