解题心得:

1.读清楚题意,本题的题意是有多个‘r’(起点),多个r多个bfs比较最短的时间即可,但是hdoj的数据比较水,直接一个起点就行了,迷宫里有多个守卫,如果在路途中遇到守卫会多花费一个时间点,求最短时间救到公主。

2.(解法一)因为遇到守卫会多花费一个时间,所以在守卫的地方再次压入,但是时间加一,这样就可以让队列里面的先验证。

3.之前将此题理解为要将所有的守卫打败之后,才能救到天使,之前题意理解错误用了回溯法,找出所有打败全部守卫的情况,找到最短的路径。此题的数据0<n<m<=200,很明显的会超时。

4.(解法二)使用优先队列,虽然看起来和解法一相差不大,但是如果打败守卫的时间不同那么解法二将明显更方便。

题目:

Rescue

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(带守卫的迷宫问题)(优先队列)的更多相关文章

  1. hdu 1242 Rescue (BFS)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. hdu 1242 Rescue

    题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...

  3. ZOJ-1649 Rescue BFS (HDU 1242)

    看题传送门: ZOJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 HDU http://acm.hdu.edu. ...

  4. hdu 1242:Rescue(BFS广搜 + 优先队列)

    Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. hdu - 1242 Rescue && hdu - 2425 Hiking Trip (优先队列+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了 ...

  6. hdu 1242 Rescue(bfs)

    此刻再看优先队列,不像刚接触时的那般迷茫!这也许就是集训的成果吧! 加油!!!优先队列必须要搞定的! 这道题意很简单!自己定义优先级别! +++++++++++++++++++++++++++++++ ...

  7. HDU 1242 Rescue(BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...

  8. HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

    题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...

  9. HDU 1242 Rescue (BFS(广度优先搜索))

    Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. Kettle-Data Integration 简介

    Pentaho系列产品介绍   Pentaho公司下面有一堆关于数据处理(数据整合.数据挖掘.报表等)的开源项目即社区版,入口网站: http://community.pentaho.com/ 数据整 ...

  2. Chart.js: 一个简单的 JS Chart Library

    Chart.js 是一个 Open Source 的 JavaScript Chart Library.它一共有 6 中 Chart,全都是 HTML5 based. 底下是 Chart.js 所提供 ...

  3. Spring cloud Eureka 服务治理(搭建服务注册中心)

    服务之类是微服务架构中最为核心的基础模块,它主要用来实现各个微服务实例的自动化注册和发现. 1. 服务注册 在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机. ...

  4. SSM整合笔记

    SSM整合笔记 1,创建maven项目 创建maven项目过程省略 ps:如果创建完maven项目之后项目报错,可能是没有配置Tomcat 2,在pom.xml里面导入相应的jar的依赖 <pr ...

  5. vue列表到详情页的实现

    路由里边的 router/index.js path:'/detail/:id' 动态id 列表页渲染时: :to="'/detail/'+item.id" ===>id是指 ...

  6. ArcSDE空间数据库中SDE用户使用探讨 (转载)

    ArcSDE作为空间数据库解决方案,应用非常广泛,本短文将尝试描述SDE的工作机制,简要说明空间数据库中SDE用户的使用方法.ArcSDE如何工作ArcSDE属于中间件技术,其本身并不能够存储空间数据 ...

  7. Git命令--保存用户名和密码

    使用git各项操作时,总是会出现输入密码的弹窗,且需要多次输入,很是繁琐,通过git命令可以记住密码,避免多次操作. 一.创建保存密码的文件 1.在home文件夹,一般是 C:\Documents a ...

  8. 基于jeesit下的工作流开发步骤

    首先jeesit是开源的OA系统,采用的框架是springMVC和mybatis,采用shiro安全验证. 1.新建流程所属表: 在数据库新建所需工作流的表之后,登录jeesit系统,在“代码生成”- ...

  9. 景安快云VPS挂载数据盘至指定目录 使得系统与数据分离

    如果我们细心的用户会发现购买景安快云VPS主机后,通过df检测看到系统盘大小与我们购买时候给的不一样,这个是很正常的事情.一般VPS主机商会通过给予系统盘和数据盘一并的数据磁盘给我们,但是默认我们看到 ...

  10. COGS 898. [咲 -Saki-] 天才麻将少女什么编

    ★☆   输入文件:sakinani.in   输出文件:sakinani.out   简单对比时间限制:1 s   内存限制:256 MB 题目背景 二十一世纪,世界上的麻将竞技人数超过一亿,日本每 ...