和普通BFS一样,不过要注意的是有火的个子和出界的格子不能加入队列,注意判断一下在push进队列即可。
/****************************
* author:crazy_石头
* date:2014/02/25
* algorithm:bfs
* Pro:UVA 11264
***************************/
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define INF 1<<29 #define eps 1e-8 #define A system("pause") #define rep(i,h,n) for(int i=(h);i<=(n);i++) #define ms(a,b) memset((a),(b),sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int maxn=2000+5; int dx[]={0,1,-1,0}; int dy[]={1,0,0,-1}; struct dot { int x,y; bool isfire; int time; }; int vis[maxn][maxn]; char map[maxn][maxn]; int test,n,m; inline bool in(dot sgx) { if(sgx.x>=0&&sgx.x
=0&&sgx.y
q; while(!q.empty()) q.pop(); ms(vis,0); rep(i,0,n-1) rep(j,0,m-1) { if(map[i][j]=='J') gx.x=i,gx.y=j,gx.isfire=0,gx.time=0; else if(map[i][j]=='F') vis[i][j]=1,q.push((dot){i,j,1,0}); else if(map[i][j]=='#') vis[i][j]=1; } q.push(gx); int ret=0; while(!q.empty()) { dot st,next; gx=q.front(),q.pop(); rep(i,0,3) { next.x=gx.x+dx[i]; next.y=gx.y+dy[i]; next.isfire=gx.isfire;//BFS的时候注意"火势蔓延",相邻格子火势是相通的; next.time=gx.time+1; if(in(next)) { if(!vis[next.x][next.y]) vis[next.x][next.y]=1,q.push(next); } else if(next.isfire==0) { ret=next.time;//记录当前答案; break; } } if(ret>0)break; } if(!ret) std::puts("IMPOSSIBLE"); else printf("%d\n",ret); } //A; return 0; }