UPC-1521 救援行动【搜索】

题目描述

Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及监狱的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?

输入

第1行两个整数n,m。表示迷宫的大小为n×m。
以后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 }
View Code

如有错误,请指正,感谢!
原文地址:https://www.cnblogs.com/scott527407973/p/9039453.html