1 #include<stdio.h> 2 #include<string.h> 3 const int N = 1010; 4 char map[N][N]; 5 int time[N][N]; 6 bool v[N][N]; 7 struct node { 8 int x, y, minute; 9 }q[N * N], joe, fire, cur, next; 10 int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}, r, c; 11 bool judge(node cur) {//边界判断 12 if(cur.x >= 0 && cur.x < r && cur.y >= 0 && cur.y < c) 13 return true; 14 else 15 return false; 16 } 17 void bfs1() { //预处理着火时间 18 int front = 0, rear = -1; 19 memset(time, -1 , sizeof(time)); 20 for(int i = 0; i < r; ++i) { 21 for(int j = 0; j < c; ++j) { 22 if(map[i][j] == 'F') { 23 cur.x = i; cur.y = j; cur.minute = 0; 24 q[++rear] = cur; 25 } 26 } 27 } 28 memset(v, 0, sizeof(v)); 29 while(front <= rear) { 30 cur = q[front++]; 31 for(int i = 0; i < 4; ++i) { 32 next.x = cur.x + dir[i][0]; 33 next.y = cur.y + dir[i][1]; 34 next.minute = cur.minute + 1; 35 if(judge(next) && map[next.x][next.y] == '.' && !v[next.x][next.y]) { 36 v[next.x][next.y] = 1; 37 time[next.x][next.y] = next.minute; 38 q[++rear] = next; 39 } 40 } 41 } 42 } 43 int bfs2(node start) { 44 int front = 0, rear = -1; 45 q[++rear] = start; 46 while(front <= rear) { 47 cur = q[front++]; 48 if(cur.x == 0 || cur .x == r - 1 || cur.y == 0 || cur.y == c - 1) { 49 return cur.minute + 1; 50 } 51 for(int i = 0; i < 4; ++i) { 52 next.x = cur.x + dir[i][0]; 53 next.y = cur.y + dir[i][1]; 54 next.minute = cur. minute + 1; 55 if(judge(next) && map[next.x][next.y] == '.' 56 && (time[next.x][next.y] == -1 || next.minute < time[next.x][next.y])) { 57 map[next.x][next.y] = '#'; 58 q[++rear] = next; 59 } 60 } 61 } 62 return -1; 63 } 64 int main() { 65 int t, i, j; 66 scanf("%d", &t); 67 while(t--) { 68 scanf("%d%d", &r, &c); 69 for(i = 0; i < r; ++i) { 70 scanf("%s", map[i]); 71 for(j = 0; j < c; ++j) { 72 if(map[i][j] == 'J') { 73 joe.x = i; 74 joe.y = j; 75 joe.minute = 0; 76 } 77 } 78 } 79 bfs1(); 80 int ans = bfs2(joe); 81 if(ans == -1) 82 printf("IMPOSSIBLE\n"); 83 else 84 printf("%d\n", ans); 85 } 86 return 0; 87 }