救援行动(save) (BFS)
时间限制: 1 Sec 内存限制: 64 MB
提交: 42 解决: 9
[提交][状态][讨论版]
题目描述
Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及监狱的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?
输入
第1行两个整数n,m。表示迷宫的大小为n×m。
以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。
输出
l行,代表救出Angel的最短时间。如果救援小组永远不能达到Angel处,则输出“NO ANSWER”。
样例输入
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
样例输出
13
【分析】 前期做一些小小的处理,后面就是简单的BFS一下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <time.h> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #define pi acos(-1.0) #define inf 0x3f3f3f3f using namespace std; int n,m,flag=0; int dis[4][2]= {1,0,0,1,-1,0,0,-1}; int vis[205][205]; string w[205]; struct man { int x,y,step; }; queue<man>q; void bfs(man s) { q.push(s); while(!q.empty()) { man t=q.front(); //printf("%d %d %d\n",t.x,t.y,t.step); if(w[t.x][t.y]=='a'){printf("%d\n",t.step);flag=1;return;} else if(w[t.x][t.y]=='x'){t.step++;q.pop();q.push(t);w[t.x][t.y]='.';continue;} q.pop(); for(int i=0;i<4;i++) { int xx=t.x+dis[i][0];int yy=t.y+dis[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0&&w[xx][yy]!='#') { man k; vis[xx][yy]=1; k.step=t.step+1;k.x=xx;k.y=yy;q.push(k); } } } } int main() { memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m);man s; for(int i=0;i<n;i++)cin>>w[i]; for(int i=0; i<n; i++) for(int j=0; j<m; j++) { if(w[i][j]=='r') { s.x=i; s.y=j; s.step=0; } } bfs(s); if(flag==0)printf("NO ANSWER\n"); return 0; }