Fire! UVA - 11624

原题链接

考察:bfs+一点技巧

很明显是要人和火一起bfs,但是这道题我不知道怎么区分本次的火和下一时间的火,于是这道题就没做出来...

看了大佬代码后的思路: 

       当火开始bfs的时候,用变量记录火队列的大小,此时的while条件不是!fq.empty()而是sz--当sz==0时退出,同理人

       这里火走过的地方没必要再开一个数组记录,直接改地图元素即可

易错:

      因为人不用考虑边界,所以地图数组必须全初始化0,否则WA

      地图下标不能从0开始...否则RE,因为也可以从上面走出边界.这里其实将地图从1,1开始赋值就可以

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstring>
 4 #include <cstdio> 
 5 #include <queue>
 6 using namespace std;
 7 const int N = 1050;
 8 int r,c,xx[4] ={-1,1,0,0},yy[4] = {0,0,-1,1};
 9 char mp[N][N];
10 bool vis[N][N];//没必要开一个火来过的地方,改成#即可 
11 struct Node{
12     int x,y,d;
13     bool Isfire;
14 };
15 vector<Node> vec;
16 int bfs()//如何判断火队列里是同一时间还是下一时间? 
17 {
18     queue<Node> rq;
19     queue<Node> fq;
20     for(int i=0;i<vec.size();i++){
21         if(vec[i].Isfire) fq.push(vec[i]);
22         else rq.push(vec[i]);
23     }
24     rq.front().d = 0;
25 //    printf("人的坐标是%d,%d\n",rq.front().x,rq.front().y);
26     while(!rq.empty())
27     {
28         int sz = fq.size(),rsz = rq.size();
29         while(sz--)
30         {
31             Node fire = fq.front();
32             fq.pop();
33             for(int i=0;i<4;i++){
34                 int dx = fire.x+xx[i],dy = fire.y+yy[i];
35                 if(dx>=5&&dx<r+5&&dy>=5&&dy<c+5&&mp[dx][dy]!='#'&&mp[dx][dy]!='F')
36                 {
37                     Node tmp; tmp.x = dx,tmp.y = dy,tmp.Isfire = true;
38                     mp[dx][dy] = 'F';
39                     fq.push(tmp);
40                 }
41             }
42         } 
43         while(rsz--)
44         {
45             Node it = rq.front();
46 //            printf("人的坐标是%d,%d\n",it.x,it.y);
47             rq.pop();
48             if(it.x>=r+5||it.y>=c+5||it.x<5||it.y<5) return it.d;
49             for(int i=0;i<4;i++){
50                 int dx = it.x+xx[i],dy = it.y+yy[i];
51                 if(mp[dx][dy]!='#'&&!vis[dx][dy]&&mp[dx][dy]!='F')
52                 {
53                     Node tmp; tmp.x = dx,tmp.y = dy,tmp.Isfire = true;
54                     tmp.d = it.d+1;
55                     vis[dx][dy] = 1;
56                     rq.push(tmp);
57                 }
58             }
59         }
60     }
61     return -1;
62 }
63 int main()
64 {
65     int T;
66     scanf("%d",&T);
67     while(T--)
68     {
69         memset(vis,0,sizeof(vis)); vec.clear();
70         memset(mp,0,sizeof(mp));
71         scanf("%d%d",&r,&c);
72         for(int i=5;i<r+5;i++){
73             for(int j=5;j<c+5;j++){
74                 cin>>mp[i][j];
75                 if(mp[i][j]=='F')
76                 {
77                     Node f; f.x = i,f.y = j,f.Isfire = 1;
78                     vec.push_back(f);
79                 }else if(mp[i][j]=='J'){
80                     Node f; f.x = i,f.y = j,f.Isfire = 0;
81                     vec.push_back(f);
82                 } 
83             }
84         }
85         int ans = bfs();
86         if(ans==-1) printf("IMPOSSIBLE\n");
87         else printf("%d\n",ans);
88     }
89     return 0;
90 } 

 

posted @ 2021-01-09 22:11  acmloser  阅读(67)  评论(0编辑  收藏  举报