UVa 11624 Fire!(BFS)

首先预处理出每个位置被大火烧到的时间,这个也是用bfs计算火的路径。

然后再正常对Joe逃跑路径bfs。


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 1005
#include <queue>
int R,C;
int F[maxn][maxn];
char M[maxn][maxn];
bool vis[maxn][maxn];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};

struct node{
	int x,y,t;
	node(){}
	node(int x,int y,int t):x(x),y(y),t(t){}
};

bool C1(int x,int y){
	if(x>=0&&x<R&&y>=0&&y<C&&!vis[x][y]) return 1;
	return 0;
}

bool C2(int x,int y,int t){
	if(x<0||x>=R||y<0||y>=C||vis[x][y]) return 0;
	else if(F[x][y]!=-1&&F[x][y]<=t) return 0;
	return 1;
}

bool OK(int x,int y){
	if(x==0||y==0||x==R-1||y==C-1)
		return 1;
	return 0;
}

void init(){
	memset(vis,0,sizeof(vis));
	memset(F,-1,sizeof(F));
	queue<node> Q;
	for(int i=0;i<R;i++){
		for(int j=0;j<C;j++){
			if(M[i][j]=='F'){
				Q.push(node(i,j,0));
				vis[i][j]=1;
				F[i][j]=0;
			}
			if(M[i][j]=='#') vis[i][j]=1;
		}
	}
	while(!Q.empty()){
		node cur=Q.front();
		Q.pop();
		for(int i=0;i<4;i++){
			int tx=cur.x+dir[i][0];
			int ty=cur.y+dir[i][1];
			if(C1(tx,ty)){
				Q.push(node(tx,ty,cur.t+1));
				F[tx][ty]=cur.t+1;
				vis[tx][ty]=1;
			}
		}
	}
	memset(vis,0,sizeof(vis));
	for(int i=0;i<R;i++){
		for(int j=0;j<C;j++){
			if(M[i][j]=='#') vis[i][j]=1;
		}
	}
}

int bfs(int x,int y){
	queue<node> Q;
	Q.push(node(x,y,0));
	if(OK(x,y)){
		return 0;
	}
	vis[x][y]=1;
	while(!Q.empty()){
		node cur=Q.front();
		Q.pop();
		for(int i=0;i<4;i++){
			int tx=cur.x+dir[i][0];
			int ty=cur.y+dir[i][1];
			if(C2(tx,ty,cur.t+1)){
				if(OK(tx,ty)) return cur.t+1;
				Q.push(node(tx,ty,cur.t+1));
				vis[tx][ty]=1;
			}
		}
	}
	return -1;
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&R,&C);
		for(int i=0;i<R;i++){
			scanf("%s",M[i]);
		}
		init();
		int res=-1;
		for(int i=0;i<R;i++){
			for(int j=0;j<C;j++){
				if(M[i][j]=='J'){
					res=bfs(i,j);
					break;
				}
			}
		}
		if(res==-1) printf("IMPOSSIBLE\n");
		else printf("%d\n",res+1);
	}
	return 0;
}
/*
2
4 4
####
#JF#
#..#
#..#
3 3
###
#J.
#.F
*/

你可能感兴趣的:(bfs)