题目链接 ZOJ链接

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
 
题解:a是目标位置,r是起始位置,通过x需要多1s时间,如果走不到输出"Poor ANGEL has to stay in the prison all his life."。
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define PI acos(-1.0)
#define ms(a) memset(a,0,sizeof(a))
#define msp memset(mp,0,sizeof(mp))
#define msv memset(vis,0,sizeof(vis))
using namespace std;
//#define LOCAL
int n,m;
char mp[][];
int dir[][]= {{,},{,-},{,},{-,}};
int ex,ey;
int vis[][];
struct Node
{
int x,y;
int time;
} cp;
int bfs()
{
queue<Node> q;
while(!q.empty())q.pop();
q.push(cp);
while(!q.empty())
{
cp=q.front(),q.pop();
if(cp.x==ex&&cp.y==ey)return cp.time;
vis[cp.x][cp.y]=;
for(int i=; i<; i++)
{
Node np;
np.x=cp.x+dir[i][];
np.y=cp.y+dir[i][];
np.time=cp.time+;
if(mp[np.x][np.y]=='#')continue;
if(vis[np.x][np.y])continue;
if(np.x<||np.y<||np.x>=n||np.y>=m)continue;
if(mp[np.x][np.y]=='x')np.time++;
q.push(np);
}
}
return -;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
msp,msv;
for(int i=; i<n; i++)cin>>mp[i];
for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
if(mp[i][j]=='a')ex=i,ey=j;
else if(mp[i][j]=='r')cp.x=i,cp.y=j;
}
cp.time=;
vis[cp.x][cp.y]=;
int ans=bfs();
if(ans==-)printf("Poor ANGEL has to stay in the prison all his life.\n");
else printf("%d\n",ans);
}
return ;
}
Answer for ZOJ
在ZOJ里再一次交了自己的代码,就发现问题了,竟然MLE了,HDU的数据也太弱了吧。
这次用优先队列去做。
 
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#define ms(a) memset(a,0,sizeof(a))
#define msp memset(mp,0,sizeof(mp))
#define msv memset(vis,0,sizeof(vis))
using namespace std;
//map,size
int n,m;
char mp[][];
//visited
bool vis[][];
//direction
int dir[][]={{,},{,-},{,},{-,}};
struct Node
{
int x,y;
int time;
friend bool operator <(const Node &a,const Node &b)
{
return a.time>b.time;
}
} cp,np; //current point,new point
int bfs()
{
//creat a priority queue
priority_queue<Node> q;
//clear
while(!q.empty())q.pop();
msv;
vis[cp.x][cp.y]=;
q.push(cp);
while(!q.empty())
{
cp=q.top(),q.pop();
//return answer
if(mp[cp.x][cp.y]=='r')
return cp.time;
for(int i=;i<;i++)
{
//new point,four direction
np.x=cp.x+dir[i][];
np.y=cp.y+dir[i][];
np.time=cp.time+;
//out of map
if(np.x<||np.x>=n||np.y<||np.y>=m)continue;
if(mp[np.x][np.y]=='#')continue;
if(vis[np.x][np.y])continue;
if(mp[np.x][np.y]=='x')np.time++;
vis[np.x][np.y]=;
q.push(np);
}
}
//can't find
return -;
}
int main()
{
while(cin>>n>>m)
{
for(int i=; i<n; i++)
cin>>mp[i];
//get start point
for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
if(mp[i][j]=='a')
{
cp.x=i,cp.y=j;
cp.time=;
break;
}
}
//bfs
int ans=bfs();
if(ans==-)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",ans);
}
return ;
}

HDU 1242 Rescue(BFS),ZOJ 1649的更多相关文章

  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(BFS+优先队列)

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

  3. hdu 1242 Rescue

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

  4. hdu 1242 Rescue(BFS,优先队列,基础)

    题目 /******************以下思路来自百度菜鸟的程序人生*********************/ bfs即可,可能有多个’r’,而’a’只有一个,从’a’开始搜,找到的第一个’r ...

  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)&amp;&amp;( BFS+优先队列)

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

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

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

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

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

随机推荐

  1. HDU 1728 逃离迷宫(DFS||BFS)

    逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...

  2. python 基础篇第一篇

    本节内容 1.python介绍 2.发展史 3.python2和python3 4.安装 5.简单程序,hello world程序 6.变量 7.用户输入 8.模块初识 9..pyc是什么? 10.数 ...

  3. java.lang.IllegalArgumentException: View not attached to window manager

    公司项目线上bug: java.lang.IllegalArgumentException: View not attached to window manager at android.view.W ...

  4. 网络爬虫-获取infoq里的测试新闻保存至html

    用java+webdriver+testng实现获取infoq里的测试新闻,获取文章标题和内容,保存至html文件 前提条件: 已安装好java环境,工程导入了webdriver的jar包和testn ...

  5. Linq 内联左联等

    我们在做SQL查询的时候经常会用到Inner Join,Left Join,笛卡尔积等等,连接方式的概念方面我想也不用给予太多解释, 我们今天的重点是让大家熟悉LINQ是如何使用Join来实现常用的表 ...

  6. gulp插件大全

    原文:http://www.mamicode.com/info-detail-517085.html No.1.run-sequence   作用:让gulp任务,可以相互独立,解除任务间的依赖,增强 ...

  7. PHP短信发送服务 youe短信企业服务

    /** * 通用短信平台HTTP接口POST方式发送短信实例 * 返回字符串 * 一般情况下调用此方法 */ function postSendMessage($msgContents,$phoneL ...

  8. LWP::UserAgent介绍2

    #这个LWP::UserAgent一般要配合其他模块使用 #比如: #HTTP::Request #HTTP::Cookie #HTTP::Respose #HTTP::Status #LWP::Us ...

  9. Python编程工具IDLE快捷键

    IDLE编辑器快捷键 自动补全代码        Alt+/(查找编辑器内已经写过的代码来补全) 补全提示              Ctrl+Shift+space(默认与输入法冲突,修改之) (方 ...

  10. KVM guest caching modes

    kvm中host和guest各自维护自己的page caches,使得内存中有两份缓存数据.host的缓存为page cache可以理解为读缓存,guest的缓存为disk write cache,可 ...