开始刷题啦= = 痛并快乐着,学到新东西的感觉其实比看那些无脑的小说、电视剧有意思多了
bfs裸体,关键是先把所有的着火点放入队列,分开一个一个做bfs会超时的
发现vis[][]是多余的,完全可以用num[][]代替了,不过不提交了。。。
uva的submission error跳得我蛋疼,可是介于管理员Carlos及时回复了,还是理解人家吧
#include<cstdio>
#include<cstring> const int MAXN=; struct P{
int x,y;
int c;
}; P que[MAXN*MAXN];
char mp[MAXN][MAXN];
int num[MAXN][MAXN],vis[MAXN][MAXN]; int dir[][]={,,-,,,,,-};
int n,m,flog;
int xi[MAXN],yi[MAXN]; void bfs(int l,int r)
{
while(l<r)
{
int x=que[l].x;
int y=que[l].y;
int c=que[l++].c;
num[x][y]=c;
for(int i=;i<;i++)
{
int dx=x+dir[i][];
int dy=y+dir[i][]; if(dx<||dy<||dx>=n||dy>=m){
if(!flog){
flog=;
que[].c=c;
}
continue;
}
if(!vis[dx][dy]&&mp[dx][dy]!='#'&&(num[dx][dy]>c+||num[dx][dy]==-)){
vis[dx][dy]=;
que[r].x=dx;
que[r].y=dy;
que[r++].c=c+;
}
}
}
} int main()
{
int T,x,y;
int i,j,k;
int l,r; scanf("%d",&T);
while(T--)
{
int tot=;
scanf("%d%d",&n,&m);
for(i=;i<n;i++)
{
getchar();
for(j=;j<m;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='J'){
x=i;
y=j;
}
if(mp[i][j]=='F'){
xi[tot]=i;
yi[tot++]=j;
}
}
} memset(num,-,sizeof(num));
memset(vis,,sizeof(vis));
for(i=;i<tot;i++)
{
vis[xi[i]][yi[i]]=;
que[i].x=xi[i];
que[i].y=yi[i];
que[i].c=;
}
bfs(,tot); memset(vis,,sizeof(vis));
flog=;
que[].x=x;
que[].y=y;
que[].c=;
bfs(,); if(flog){
printf("%d\n",que[].c);
}else {
printf("IMPOSSIBLE\n");
}
}
return ;
}
/*
8 8
........
..F...F.
....J...
...F....
......F.
........
........
........ 5 5
.....
.###.
.#J#.
.###.
..... 5 5
.....
.#F#.
.FJF.
.#F#.
..... 5 5
....F
.#.#.
..J..
.#.#.
F.... 5 5
....F
.#.#.
..J..
.#.#.
.....
*/