时间限制: 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一下。
#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,a,b; int dis[8][2]= {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1}; int vis[15][15]; int w[15][15]; string str; struct man { int x,y,step; }; queue<man>q; void bfs(man s,int enx,int eny) { q.push(s); vis[s.x][s.y]=1; while(!q.empty()) { man t=q.front(); q.pop(); //printf("%d %d %d\n",t.x,t.y,t.step);system("pause"); if(t.x==enx&&t.y==eny) { printf("%d moves\n",t.step); flag=1; return; } for(int i=0; i<8; i++) { int xx=t.x+dis[i][0]; int yy=t.y+dis[i][1];// //printf("%d %d\n",xx,yy); if(xx>=0&&xx<8&&yy>=0&&yy<8&&w[xx][yy]!=1&&vis[xx][yy]==0) { man k; k.x=xx; k.y=yy; k.step=t.step+1; q.push(k); vis[xx][yy]=1; } } } } int main() { int g,h;int cnt=0; while(~scanf("%d",&n)) {cnt++;flag=0; while(!q.empty())q.pop(); int enx;int eny; if(n==-1)break; memset(vis,0,sizeof(vis)); memset(w,0,sizeof(w)); while(n--) { cin>>str; w[str[0]-‘a‘][str[1]-‘1‘]=1; } string sta,en; cin>>sta>>en; man s;s.x=sta[0]-‘a‘;s.y=sta[1]-‘1‘;s.step=0;q.push(s); enx=en[0]-‘a‘;eny=en[1]-‘1‘; printf("Board %d: ",cnt); bfs(s,enx,eny); if(flag==0)puts("not reachable"); } return 0; }
帅到没朋友
时间: 2024-10-17 22:35:33