BFS:HDU-1242-Rescue(带守卫的迷宫问题)(优先队列)
解题心得:
1.读清楚题意,本题的题意是有多个‘r’(起点),多个r多个bfs比较最短的时间即可,但是hdoj的数据比较水,直接一个起点就行了,迷宫里有多个守卫,如果在路途中遇到守卫会多花费一个时间点,求最短时间救到公主。
2.(解法一)因为遇到守卫会多花费一个时间,所以在守卫的地方再次压入,但是时间加一,这样就可以让队列里面的先验证。
3.之前将此题理解为要将所有的守卫打败之后,才能救到天使,之前题意理解错误用了回溯法,找出所有打败全部守卫的情况,找到最短的路径。此题的数据0<n<m<=200,很明显的会超时。
4.(解法二)使用优先队列,虽然看起来和解法一相差不大,但是如果打败守卫的时间不同那么解法二将明显更方便。
题目:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29754 Accepted Submission(s): 10489
Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.
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.)
Input
First line contains two integers stand for N and M.
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.
Output
For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life."
Sample Input
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
Sample Output
13
Author
CHEN, Xue
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int x,y,step;
}now,Next;
char maps[210][210];
int use[210][210],n,m;
int dir[4][2]={1,0,-1,0,0,1,0,-1}; bool check(int x,int y)
{
if(x<0 || y<0 || x>=n || y>=m || use[x][y] || maps[x][y] == '#')
return false;
else
return true;
}
void maps_store()
{ for(int i=0;i<n;i++)
{
scanf("%s",maps[i]);
for(int j=0;j<m;j++)
{
if(maps[i][j] == 'r')
{
now.x = i;
now.y = j;
now.step = 0;
}
}
}
} void bfs()
{
queue <node> qu;
qu.push(now);
use[now.x][now.y] = 1;
while(!qu.empty())
{
now = qu.front();
qu.pop();
if(maps[now.x][now.y] == 'a')
{
printf("%d\n",now.step);
return ;
}
if(maps[now.x][now.y] == 'x')
{
maps[now.x][now.y] = '.';
now.step = now.step + 1;
use[now.x][now.y] = 1;
qu.push(now);//再次压入
continue;
}
for(int i=0;i<4;i++)
{
Next.x = now.x + dir[i][0];
Next.y = now.y + dir[i][1];
Next.step = now.step + 1;
if(check(Next.x,Next.y))
{
use[Next.x][Next.y] = 1;
qu.push(Next);
}
}
}
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(use,0,sizeof(use));
maps_store();
bfs();
}
}
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxsize = 210;
int n,m,dir[4][2] = {1,0,-1,0,0,1,0,-1},use[maxsize][maxsize];
char map[maxsize][maxsize];
struct node
{
int x,y,time;
friend bool operator < (node a,node b)//队列中排序的判断,注意写法
{
return a.time>b.time;
}
} now,Next; priority_queue <node> pr_qu;//优先队列 void map_store()
{
for(int i=0; i<n; i++)
cin>>map[i];
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(map[i][j] == 'r')
{
now.x = i;
now.y = j;
now.time = 0;
use[now.x][now.y] = 1;
return;
}
}
}
} bool check(int x,int y)
{
if(x<0 || y<0 || x>=n || y>=m || map[x][y] == '#' || use[x][y] == 1)
return false;
else
return true;
} int bfs()
{
while(!pr_qu.empty())
pr_qu.pop();
pr_qu.push(now);
while(!pr_qu.empty())
{
now = pr_qu.top();
if(map[now.x][now.y] == 'a')
return now.time;
for(int i=0; i<4; i++)
{
Next.x = now.x + dir[i][0];
Next.y = now.y + dir[i][1];
if(check(Next.x,Next.y))
{
if(map[Next.x][Next.y] == 'x')//注意这部分的位置
Next.time = now.time + 2;
else
Next.time = now.time + 1;
pr_qu.push(Next);
use[Next.x][Next.y] = 1;
}
}
pr_qu.pop();
}
return -1;//没有找到a时返回-1
}
int main()
{
while(cin>>n>>m)
{
memset(use,0,sizeof(use));
map_store();
int Time = bfs();
if(Time == -1)
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
else
cout<<Time<<endl;
}
}
BFS:HDU-1242-Rescue(带守卫的迷宫问题)(优先队列)的更多相关文章
- hdu 1242 Rescue (BFS)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1242 Rescue
题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...
- ZOJ-1649 Rescue BFS (HDU 1242)
看题传送门: ZOJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 HDU http://acm.hdu.edu. ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu - 1242 Rescue && hdu - 2425 Hiking Trip (优先队列+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了 ...
- hdu 1242 Rescue(bfs)
此刻再看优先队列,不像刚接触时的那般迷茫!这也许就是集训的成果吧! 加油!!!优先队列必须要搞定的! 这道题意很简单!自己定义优先级别! +++++++++++++++++++++++++++++++ ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
随机推荐
- 常见的SQL错误和解决方法
前言 今天你会看到每个人——从新手到专家——在使用SQL时犯的各种常见错误.你不能永远避免犯任何错误,但是熟悉广泛的错误将帮助你在尽可能短的时间内解决这些错误. 注:在我们的例子中我们使用的是Orac ...
- Android 中文 API (101) —— AsyncTask
一.结构 public abstract class AsyncTask extends Object java.lang.Object android.os.AsyncTask<Params, ...
- JAVA中的多态概念
多态性是指同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件 需要存在继承和实现关系 同样的方法调用而执行不同操作,运行不同代码. 在运行时父类或者接口的引用变量 ...
- 美国移民局的I797表原件和I129表是什么呢
I-129表,Petition for a Non-immigrant Worker,即非移民工作许可申请表I797 表 ,Original L1-1A approval notice L1签证批准通 ...
- HDU 4745 Two Rabbits (区间DP)
题意: 两只兔子,在一个由n块石头围成的环上跳跃,每块石头有一个权值ai.开始时两兔站在同一石头上(也算跳1次),一只从左往右跳,一只从右往左跳,两只同时跳,而每跳一次,两只兔子所站的石头的权值都要相 ...
- lattice diamond fpga 状态机的理解
比如序列检测101,需要三个状态 :so,s1,s2. 思路:(1)s0状态有两种情况0或1,若为0时在自身打圈,是1时进入s1状态. (2)s1状态有两种0或1,若为1自身打圈,因为1可以作为下次检 ...
- vs2010 opencv2.4.10 配置过程出现的问题 & mfc打开图片
配置参考网址: http://blog.csdn.net/zy122121cs/article/details/49180541 无法启动程序,系统找不到指定的文件:原因是程序编译有错误(不是路径之类 ...
- .net reflector 的缺陷
.net reflector是一个反编译DLL的工具,在安装后如果电脑上有VS也会同时安装到VS里面,但是他是收费的,虽然反编译的效果很好,但是运行VS2013时(或许其他版本也有这样的问题)如果项目 ...
- iOS中的崩溃类型
http://blog.csdn.net/womendeaiwoming/article/details/44243571 OS中的崩溃类型 在这里了解一下XCode用来表示各种崩溃类型的术语,补充一 ...
- [UIImage imageWithContentsOfFile:@""] 内存警告
You will want to use the [UIImage imageWithContentsOfFile:@""] method, as that doesn't cac ...