#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <queue> #include <utility> using namespace std; int r,c; int map[1010][1010]; int time[1010][1010]; int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; queue< pair<int,int> > J; //声明方式 queue< pair<int,int> > F; void print() { int i,j; for(i = 0; i < r+1; i++) { for(j = 0; j<c+1; j++) { printf("%d ",time[i][j]); } printf(" "); } printf(" "); } void bfs_fire() { pair<int, int> FF; int t, i, x, y; while( !F.empty() ) { FF = F.front(); F.pop(); t = time[FF.first][FF.second]; for( i = 0; i < 4; i++) { x = FF.first + dir[i][0]; y = FF.second + dir[i][1]; if(x >= r || x < 0 || y >= c || y < 0)//越界 continue; if( time[x][y] == 0 ) { time[x][y] = t + 1; F.push(make_pair(x, y)); } } } } void bfs_people() { pair<int,int> JJ; int t, i, x, y, ok = 0; while( !J.empty() ) { JJ = J.front(); J.pop(); t = map[JJ.first][JJ.second]; map[JJ.first][JJ.second] = -1;//标记访问(把这个地方变成墙就行) for( i = 0; i < 4; i++)//向四个方向扩展(能走的) { x = JJ.first + dir[i][0]; y = JJ.second + dir[i][1]; //pair 具有 first 与 second 成员 if(x >= r || x < 0 || y >= c || y < 0)//越界 continue; if( map[x][y] == -1 || map[x][y] <= time)//墙或超时 continue; else if( x == r - 1 || x == 0 || y == 0 || y == c - 1 )//边界则走完 { ok = 1; printf("%d ", time); return; } else { J.push(make_pair(x, y));//queue中插入pair 利用make_pair()方法 } } } if(ok == 0) printf("IMPOSSIBLE "); } */ int main() { int N; int i,j; char temp; freopen("1.txt", "r", stdin); scanf("%d", &N); getchar(); while(N--) { while( !J.empty() ) J.pop(); //注意初始化(清空)队列 while( !F.empty() ) F.pop(); memset(map, -1, sizeof(map)); memset(time, -1, sizeof(time)); scanf("%d%d", &r, &c); getchar(); for(i = 0; i < r; i++) { for(j = 0; j < c; j++) {//# = -1 F = 1 . = 0 scanf("%c", &temp);//当读取%c时,注意用getchar吸收掉不必要的回车 if(temp == '#'){map[i][j] = time[i][j] = -1;} else if(temp == 'F'){map[i][j] = time[i][j] = 1;F.push(make_pair(i,j));} else if(temp == 'J'){map[i][j] = 1;time[i][j] = 0;J.push(make_pair(i,j));} else{map[i][j] = time[i][j] = 0;} } getchar(); } bfs_fire(); // bfs_people(); } return 0; }