题目描述
Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及监狱的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?
假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?
输入
第1行两个整数n,m。表示迷宫的大小为n×m。
以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。
以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。
输出
1行,代表救出Angel的最短时间。如果救援小组永远不能达到Angel处,则输出“NO ANSWER”。
样例输入
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
样例输出
13
题目要求最短路径,想到bfs()。不同的是当走到x时,杀死看守也要消耗一个单位的时间。我们可以先做一个预处理,如果我们走到x,只让当前的时间加一,然后加到队列,而不继续往下搜索。接着就是简单的bfs()了。
不能走到x时,让时间加二,再往下搜索。
1 #include<cstdio> 2 #include<queue> 3 using namespace std; 4 const int dx[4]={1,-1,0,0}; 5 const int dy[4]={0,0,1,-1}; 6 struct node 7 { 8 int x,y,t; 9 }; 10 char mp[205][205]; 11 bool vis[205][205]; 12 int n,m,sx,sy; 13 void bfs(int sx,int sy) 14 { 15 queue<node>q; 16 node fre,nex; 17 fre.x=sx; 18 fre.y=sy; 19 fre.t=0; 20 q.push(fre); 21 while(!q.empty()) 22 { 23 fre=q.front(); 24 q.pop(); 25 if(mp[fre.x][fre.y]=='a') 26 { 27 printf("%d ",fre.t); 28 return ; 29 } 30 else if(mp[fre.x][fre.y]=='x') 31 { 32 fre.t++; 33 mp[fre.x][fre.y]='.'; 34 q.push(fre); 35 continue; 36 } 37 for(int i=0;i<4;i++) 38 { 39 int nx=fre.x+dx[i]; 40 int ny=fre.y+dy[i]; 41 if(mp[nx][ny]!='#'&&!vis[nx][ny]&&nx>=0&&nx<n&&ny>=0&&ny<m) 42 { 43 vis[nx][ny]=1; 44 nex.x=nx; 45 nex.y=ny; 46 nex.t=fre.t+1; 47 q.push(nex); 48 } 49 } 50 } 51 printf("NO ANSWER "); 52 return ; 53 } 54 int main() 55 { 56 // freopen("in.txt","r",stdin); 57 scanf("%d%d",&n,&m); 58 for(int i=0;i<n;i++) 59 { 60 for(int j=0;j<m;j++) 61 { 62 scanf(" %c",&mp[i][j]); 63 vis[i][j]=0; 64 if(mp[i][j]=='r') 65 { 66 sx=i; 67 sy=j; 68 } 69 } 70 } 71 bfs(sx,sy); 72 return 0; 73 }