HDU 1242 Rescue(BFS),ZOJ 1649
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.
#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 ;
}
这次用优先队列去做。
#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的更多相关文章
- hdu 1242 Rescue (BFS)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- hdu 1242 Rescue
题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...
- hdu 1242 Rescue(BFS,优先队列,基础)
题目 /******************以下思路来自百度菜鸟的程序人生*********************/ bfs即可,可能有多个’r’,而’a’只有一个,从’a’开始搜,找到的第一个’r ...
- 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)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
随机推荐
- Spark Wordcount
1.Wordcount.scala(本地模式) package com.Mars.spark import org.apache.spark.{SparkConf, SparkContext} /** ...
- Python基础知识学习_Day5
一.生成器和迭代器 1.列表生成 >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> a = map(lambda x:x+1, a ...
- js onblur 和 onkeyup 事件用法
1. onblur 表示失去焦点时触发 2. onkeyup 表示键盘每输完一个字符之后触发,就是键盘上的按键被放开时. 例子如下: <!DOCTYPE HTML PUBLIC "-/ ...
- C#基础--值类型和引用类型
C#中大多数类型都是引用类型,只有个别特殊情况是值类型. 值类型: 枚举(enum) 结构(struct) 基础类型:int, short, char, bool....(string是引用类型) 引 ...
- Python中fileinput模块使用
fileinput模块可以对一个或多个文件中的内容进行迭代.遍历等操作.该模块的input()函数有点类似文件 readlines()方法,区别在于前者是一个迭代对象,需要用for循环迭代,后者是一次 ...
- 更改系统相机UIImagePickerController导航栏的cancle为自定义按钮
有时候需要对系统相册里面的取消按钮进行自定义,并获取点击事件做一些操作,那么你可以这样做. 第一:实现navigationController代理 - (void)navigationControll ...
- Redis Cluster 实践
一:关于redis cluster 1:redis cluster的现状 reids-cluster计划在redis3.0中推出,可以看作者antirez的声明:http://antirez.com/ ...
- 解决 bootstrap 在IE8下的兼容问题
<meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="v ...
- 构建maven的web项目时注意的问题
构建项目后或者导入项目后,我们需要bulid path--->config build path 特别是maven的依赖一定要 发布到WEB_INF的lib下面,不然在发布项目的时候,这些依赖都 ...
- Scala Apply
class ApplyTest{ //一定要写(),不加括号就报错. def apply() = println("Into Spark!") def havaAtry(){ pr ...