hdu1242 Rescue DFS(路径探索题)
这里我定义的路径探索题指 找某路能够到达目的地,每次走都有方向,由于是探索性的走 之后要后退 那些走过的状态都还原掉
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1242
Rescue
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15884 Accepted Submission(s): 5759
Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up,
down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.
You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)
Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.
Process to the end of the file.
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
13
大意:天使 a被关 朋友r(可以有多个)要去救天使 r要绕过#(障碍物)和x(守卫)去寻找天使a 不能穿过障碍物 要走守卫那一步必须打败守卫 时间为2,其他每步时间为1;
问找到天使的最短时间;
思路:用搜索做,由于r可以有多个,所以从天使a出发,每次都有四个方向可以走 用visit[x][y]记录该点是否被走过,如往一个方向走但是另一个点被visit过就不会重复走了
往其中一个方向走后继续进行dfs直到找到r或者无路可走 注意由于是探索性的走,走完进行DFS后记得往后退,状态还原;
代码如下:
#include<iostream>
using namespace std;
#include<string.h>
#define max 205
char map[max][max];
long a[100000],step,sum,n,m,visited[max][max];
long directions[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //DFS 不用队列,不用结构体
/*
*
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........ output<<13
*/
void DFS(int x,int y)
{
int i,mx,my; if(map[x][y]=='r')
a[sum++]=step; else if(map[x][y]!='#')
{ for(i=0;i<4;i++)
{
mx=x+directions[i][0];
my=y+directions[i][1]; if(map[mx][my]!='#'&&mx>=1&&mx<=n&&my>=1&&my<=m&&!visited[mx][my])//不是墙并且没走过
{
if(map[x][y]=='x')
step++;
step++;
visited[mx][my]=1; DFS(mx,my); //所以关键要得到值的是递归的这一步 推导的时候让这个的下一个DFS就是到达朋友那点比较好理解为什么后面要还原 visited[mx][my]=0;//这一步的原因,上面DFS进行完后要将状态还原
step--; //下面这些都要还原
if(map[x][y]=='x')
step--; }
}
}
} int main()
{ long i,j,x,y,min;
while(cin>>n>>m)
{ memset(visited,0,sizeof(visited));
sum=0;
step=0;
min=max; for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='a')//记录天使的地址
{
x=i;
y=j;
}
}
} visited[x][y]=1;
DFS(x,y); if(sum==0)
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
else
{
for(i=0;i<sum;i++)
if(a[i]<min)
min=a[i];
cout<<min<<endl; } }
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu1242 Rescue DFS(路径探索题)的更多相关文章
- hdu1242 Rescue(BFS +优先队列 or BFS )
http://acm.hdu.edu.cn/showproblem.php?pid=1242 题意: Angel被传说中神秘的邪恶的Moligpy人抓住了!他被关在一个迷宫中.迷宫的长.宽不超 ...
- POJ 2023 Choose Your Own Adventure(树形,dfs,简单题)
题意: 输入一个整数n,表示有n组测试数据, 每组第一行输入一个整数x表示该组测试一共有x页,接下来输入x行,每行表示一页, 每页或者以C开头(第一页都是以C开头),或者以E开头,中间用引号括起一段文 ...
- 树链剖分||dfs序 各种题
1.[bzoj4034][HAOI2015]T2 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把 ...
- HDU1242 Rescue(BFS+优先队列)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu1010 dfs+路径剪枝
题意:用一个案例来解释 4 4 5 S.X. ..X. ..XD .... 在这个案例中,是一个4*4的地图. . 表示可走的地方, X 表示不可走的地方,S表示起始点,D表示目标点.没走到一个点之后 ...
- [poj]2488 A Knight's Journey dfs+路径打印
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45941 Accepted: 15637 Description Bac ...
- HDU 1242 rescue (优先队列模板题)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 图的遍历 | 1131地铁图: dfs复杂模拟题
这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...
随机推荐
- js 变量声明易混淆的几点知识
这是我 JavaScript 学习过程中遇到的一些容易混淆的地方,趁着有时间,做了一个整理. 变量提升 变量与函数名提升优先级 js 作用域内有变量,这个很好理解,但有一些细节需要注意. consol ...
- MongoDB 数据类型查询 — $type使用
MongoDB 使用过程中经常需要根据字段的类型来查询数据, 而MongoDB中查询字段类型是通过$type操作符来实现. $type使用法语: db.集合名.find({$type:类型值}); / ...
- PHP常用函数归类【持续整理】
学习了这么久PHP,基础知识总感觉不牢靠,尤其是数组,字符串函数的应用,全部手敲过次手,做出总结都是基础,在回顾一下吧. 一.PHP基础语法 变量,常量 严格区分大小写,但内置结构或关键字无所 ...
- springboot配置kafka生产者和消费者详解
在原有pom.xml依赖下新添加一下kafka依赖ar包 <!--kafka--> <dependency> <groupId>org.springframewor ...
- centos 安装 telnet
(转)centos7安装telnet服务 场景:在进行Telnet测试时候,发现无法连接,所以还得把这个软件也安装了 1 CentOS7.0 telnet-server 启动的问题 解决方法: 先 ...
- 深入浅出MFC学习笔记 第三章 MFC六大关键技术之仿真
0:MFC类层次结构 1:MFC程序的初始化过程CWinApp::InitApplication()CMyWinApp::InitInstance()CMyFrameWnd::CMyFrameWnd( ...
- 5.18-笨办法学python-习题17(文件拷贝)
from sys import argv from os.path import exists #又import了一个命令exists,这个命令将文件名字符串作为参数,如果文件存在返回TRUE,否则返 ...
- Shrio第一天——入门与基本概述
一.Shiro是什么 Apache Shiro是Java的一个安全框架.(希罗:/笑哭) Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境. sh ...
- 我遇到的有关git的问题及解决方法总结
有关git的问题 ** 1.在github上创建项目 2.使用git clone https://github.com/xxxxxxx/xxxxx.git克隆到本地 3.编辑项目 4.git add ...
- 20155209 实验三 敏捷开发与XP实践
20155209 实验三 敏捷开发与XP实践 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 提交点一: 在IDEA中使用工具(Code->Reformate Code)把下面代码 ...