POJ 3669 Meteor Shower BFS 水~

http://poj.org/problem?id=3669

题目大意:

一个人从(0,0)出发,这个地方会落下陨石,当陨石落在(x,y)时,会把(x,y)这个地方和相邻的的四个地方破坏掉,求该人到达安全地点的最小时间,若无解输出-1

思路:

好吧,我最近都在做水题。

输入的时候更新地图,每个点取最小的被破坏的时间,然后进行BFS,在BFS途中,如果当前时间>=被破坏的,那么就代表不能进入。



#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=300+10;
const int dx[]={1,-1,0,0,0};
const int dy[]={0,0,1,-1,0};
int map[MAXN][MAXN];
bool vis[MAXN][MAXN];
void update(int x,int y,int t)
{
	if(x<0||y<0) return;
	if(map[x][y] !=-1 && map[x][y]<=t) return;
	map[x][y]=t;
}

struct state
{
	int x,y,t;
	state(int x=0,int y=0,int t=0):x(x),y(y),t(t){}
};

int bfs()
{
	memset(vis,0,sizeof(vis));
	queue<state> q;
	q.push(state(0,0,0));
	while(!q.empty())
	{
		state cur=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int nx=cur.x+dx[i];
			int ny=cur.y+dy[i];
			if( nx<0 || ny<0 ) continue;
			if(map[nx][ny]==-1) return cur.t+1;
			int nt=cur.t+1;
			if( vis[nx][ny] || nt>=map[nx][ny]) continue;
			q.push(state(nx,ny,nt));
			vis[nx][ny]=true;
		}
	}
	return -1;
}
int main()
{
	int m;
	while(~scanf("%d",&m))
	{
		memset(map,-1,sizeof(map));
		for(int i=0;i<m;i++)
		{
			int x,y,t;
			scanf("%d%d%d",&x,&y,&t);
			for(int i=0;i<5;i++)
				update(x+dx[i],y+dy[i],t);
		}
		printf("%d\n",bfs());
	}
	return 0;
}


posted @ 2014-04-25 20:27  hr_whisper  阅读(176)  评论(0编辑  收藏  举报