1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 #define maxn 1010 6 using namespace std; 7 8 char s[maxn][maxn]; 9 int g[maxn][maxn]; 10 int T,n,m; 11 int dx[4]={0,1,0,-1}; 12 int dy[4]={1,0,-1,0}; 13 14 bool inside(int cx,int cy) 15 { 16 return cx>0 && cx<=n && cy>0 && cy<=m; 17 } 18 19 bool border(int cx,int cy) 20 { 21 return cx==1 || cx==n || cy==1 || cy==m; 22 } 23 24 void init_fire() 25 { 26 for (int i=1; i<=n; i++) 27 for (int j=1; j<=m; j++) g[i][j]=99999999; 28 queue<int> qx,qy; 29 for (int i=1; i<=n; i++) 30 for (int j=1; j<=m; j++) 31 if (s[i][j]=='F') qx.push(i),qy.push(j),g[i][j]=0; 32 while (!qx.empty()) 33 { 34 int cx=qx.front(),cy=qy.front(); 35 qx.pop(),qy.pop(); 36 for (int i=0; i<4; i++) 37 { 38 if (!inside(cx+dx[i],cy+dy[i])) continue; 39 if (s[cx+dx[i]][cy+dy[i]]!='.') continue; 40 if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue; 41 g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1; 42 qx.push(cx+dx[i]),qy.push(cy+dy[i]); 43 } 44 } 45 } 46 47 int bfs() 48 { 49 queue<int> qx,qy; 50 for (int i=1; i<=n; i++) 51 for (int j=1; j<=m; j++) 52 if (s[i][j]=='J') 53 { 54 g[i][j]=0; 55 qx.push(i),qy.push(j); 56 if (border(i,j)) return 1; 57 } 58 while (!qx.empty()) 59 { 60 int cx=qx.front(),cy=qy.front(); 61 qx.pop(),qy.pop(); 62 for (int i=0; i<4; i++) 63 { 64 if (s[cx+dx[i]][cy+dy[i]]!='.') continue; 65 if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue; 66 if (border(cx+dx[i],cy+dy[i])) return g[cx][cy]+2; 67 g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1; 68 qx.push(cx+dx[i]),qy.push(cy+dy[i]); 69 } 70 } 71 return -1; 72 } 73 74 int main() 75 { 76 scanf("%d",&T); 77 while (T--) 78 { 79 scanf("%d%d",&n,&m); 80 for (int i=1; i<=n; i++) scanf("%s",s[i]+1); 81 init_fire(); 82 int ans=bfs(); 83 if (ans==-1) puts("IMPOSSIBLE"); 84 else printf("%d\n",ans); 85 86 } 87 return 0; 88 }
UVA11624 【Fire!】
猜你喜欢
转载自www.cnblogs.com/zytwan/p/9931530.html
今日推荐
周排行