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; }