这个题的意思就是J在迷宫内,一部分迷宫着火了(F),F和J每分钟都走一格,且都不能穿墙,当J走到迷宫的边缘时可以穿出迷宫(穿出迷宫需要一分钟的时间),让求出走出迷宫最小时间,如果走不出输出IMPOSSIBLE。
将F和J的位置同时入队bfs就行了, F走过的位置J就不能走了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef struct
{
int x, y;
int step;
int QAQ;
}node;
int v[1100][1100];
char map[1100][1100];
int n, m, k;
node p[1100];
void dfs(int x, int y)
{
node a, b;
queue<node>q;
int i;
for(i = 0;i < k;i++)
{
a.x = p[i].x;
a.y = p[i].y;
a.step = 0;
a.QAQ = 0;
v[a.x][a.y] = 1;
q.push(a);
}
a.x = x;
a.y = y;
a.step = 0;
a.QAQ = 1;
v[x][y] = 1;
q.push(a);
while(!q.empty())
{
a = q.front();
q.pop();
if(a.QAQ == 1 && (a.x == 0 || a.x == n - 1 || a.y == 0 || a.y == m - 1))
{
cout<<a.step + 1<<endl;
return;
}
if(a.x + 1 < n && map[a.x+1][a.y] != '#' && !v[a.x+1][a.y])
{
b.x = a.x + 1;
b.y = a.y;
b.step = a.step + 1;
b.QAQ = a.QAQ;
v[b.x][b.y] = 1;
q.push(b);
}
if(a.x - 1 >= 0 && map[a.x-1][a.y] != '#' && !v[a.x-1][a.y])
{
b.x = a.x - 1;
b.y = a.y;
b.step = a.step + 1;
b.QAQ = a.QAQ;
v[b.x][b.y] = 1;
q.push(b);
}
if(a.y + 1 < m && map[a.x][a.y+1] != '#' && !v[a.x][a.y+1])
{
b.x = a.x;
b.y = a.y + 1;
b.step = a.step + 1;
b.QAQ = a.QAQ;
v[b.x][b.y] = 1;
q.push(b);
}
if(a.y - 1 >= 0 && map[a.x][a.y-1] != '#' && !v[a.x][a.y-1])
{
b.x = a.x;
b.y = a.y - 1;
b.step = a.step + 1;
b.QAQ = a.QAQ;
v[b.x][b.y] = 1;
q.push(b);
}
}
cout<<"IMPOSSIBLE"<<endl;
}
int main()
{
int x, y, i, j, t;
cin>>t;
while(t--)
{
cin>>n>>m;
k = 0;
for(i = 0;i < n;i++)
{
for(j = 0;j < m;j++)
{
cin>>map[i][j];
v[i][j] = 0;
if(map[i][j] == 'J')
{
x = i;
y = j;
}
if(map[i][j] == 'F')
{
p[k].x = i;
p[k++].y = j;
}
}
}
dfs(x,y);
}
return 0;
}