UVA 11624 - Fire! 图BFS

看题传送门


昨天晚上UVA上不去今天晚上才上得去,这是在维护么?

然后去看了JAVA,感觉还不错昂~

晚上上去UVA后经常连接失败作死啊。


第一次做图的题~

基本是照着抄的T T

不过搞懂了图的BFS,虽然不像二叉树的BFS那么直观。


#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1000+24;
const int INF=9999999;
int R,C,jr,jc,d[MAXN][MAXN][2],ans;
bool vis[MAXN][MAXN][2];
char maze[MAXN][MAXN];
const int dir_r[4]={1,-1,0,0};
const int dir_c[4]={0,0,1,-1};

struct site
{
	int r,c;
	site(int i,int j): r(i),c(j){}
};

queue<site> Q;
void bfs(int kind)
{
	while(!Q.empty())
	{
		int r=Q.front().r,c=Q.front().c;
		Q.pop();
		for(int i=0;i<4;i++)
		{
			int r_now=r+dir_r[i],c_now=c+dir_c[i];
			if(r_now>=0 && r_now<R && c_now>=0 && c_now<C && maze[r_now][c_now] == '.' && vis[r_now][c_now][kind]==false)
			{
				Q.push(site(r_now,c_now));
				vis[r_now][c_now][kind] = true;
				d[r_now][c_now][kind] = d[r][c][kind] + 1;
			}
		}
	}

}

void check(int r,int c)
{
	if(maze[r][c]!='.' || vis[r][c][0]==false) return;
	if( vis[r][c][1]==0 || d[r][c][0]<d[r][c][1] )
		 ans = min(ans, d[r][c][0] + 1); 
	  
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		memset(vis, 0, sizeof(vis));
		memset(d, 0, sizeof(d));
		vector<site> fire;
		
		//input
		scanf("%d%d",&R,&C);
		for(int i=0;i<R;i++)
		{
			scanf("%s",maze[i]);
			for(int j=0;j<C;j++)
			{
				if(maze[i][j]=='J'){  jr=i; jc=j; maze[i][j] = '.'; }
				else if(maze[i][j]=='F') { fire.push_back(site(i,j)); maze[i][j] = '.'; }
			}
		}
		
		//joe
		vis[jr][jc][0]=true;
		d[jr][jc][0]=0;
		Q.push(site(jr,jc));
		bfs(0);
		
		//Fire;
		for(int i=0;i<fire.size();i++)
		{
			 vis[fire[i].r][fire[i].c][1] = true;
			 d[fire[i].r][fire[i].c][1] = 0;
			 Q.push(fire[i]);
		}
		bfs(1);

		//answer
		ans=INF;
		for(int i=0;i<R;i++)	{	check(i,0);check(i,C-1);	}
		for(int i=0;i<C;i++)	{	check(0,i);check(R-1,i);	}  
		 if(ans == INF) printf("IMPOSSIBLE\n"); else printf("%d\n", ans);
	}
}


posted @ 2013-08-14 23:52  hr_whisper  阅读(164)  评论(0编辑  收藏  举报