大致题意:
有意思的一道搜索题,大意是说一个人在森林里,森林里着火了,问能不能走出去。
其中’F’代表火源,可能不止一个,然后火势会向上下左右四个方向蔓延。
解题思路:
将’F’火源先放入队列,再把人物所在位置放队列中,这样就像回合制游戏一样,火势先手,处理好蔓延的火势,又放入队列中,接着再处理人。
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,k;
node() {
x=0;y=0;k=0;
};
};
char s[1005][1005];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m;
queue<node> q;
bool vis[1005][1005];
int bfs()
{
memset(vis,0,sizeof(vis));
node t,tt;
bool ok=false;
while(!q.empty())
{
t=q.front();q.pop();
if(t.k!=-1&&(t.x==0||t.y==0||t.x==m-1||t.y==n-1)) {
ok=true;break;
}
for(int i=0;i<4;i++)
{
int xx=t.x+dx[i];
int yy=t.y+dy[i];
if(t.k==-1) {
if(xx<m&&xx>=0&&yy>=0&&yy<n&&s[xx][yy]!='#'&&s[xx][yy]!='F')
{
zk=true;
node tt;
tt.x=xx;tt.y=yy;tt.k=-1;
s[tt.x][tt.y]='F';
q.push(tt);
}
}
else {
if(s[xx][yy]=='.'&&!vis[xx][yy]) {
zk=true;
node tt;
vis[xx][yy]=1;
tt.x=xx;tt.y=yy;tt.k=t.k+1;
q.push(tt);
}
}
}
}
if(ok) return t.k+1;
else return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
while(!q.empty()) q.pop();
int x,y;
for(int i=0;i<m;i++) scanf("%s",s[i]);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(s[i][j]=='F') {
node t;
t.x=i;t.y=j;t.k=-1;
q.push(t);
}
if(s[i][j]=='J') {
x=i;y=j;
}
}
node t;t.x=x;t.y=y;t.k=0;
q.push(t);
int z=bfs();
if(z) cout<<z<<endl;
else cout<<"IMPOSSIBLE"<<endl;
}
}