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 }