bzoj1611[Usaco2008 Feb]Meteor Shower流星雨php
題意:安全
給個網格,有m個流星,每一個流星在ti時刻打在(xi,yi)的格子上,並把該格子和相鄰的格子打爛。有我的從(0,0)出發,問最短逃離時間(格子被打爛以後就不能走)。spa
題解:code
bfs一發,若是某格子被打爛的時間小於到達時間則不能到達,最後若是到達打爛時間爲正無窮的格子即爲成功逃出。注意網格的邊界應該大於流星的邊界,由於若是逃到那些地方也算安全地帶。blog
代碼:get
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 500 7 #define INF 0x3fffffff 8 using namespace std; 9 10 inline int read(){ 11 char ch=getchar(); int f=1,x=0; 12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 13 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 14 return f*x; 15 } 16 int m,vis[maxn][maxn],ear[maxn][maxn]; queue<pair<int,int> >q; 17 int bfs(){ 18 q.push(make_pair(1,1)); if(!ear[1][1])return -1; 19 while(!q.empty()){ 20 int x=q.front().first,y=q.front().second; q.pop(); 21 if(x>1&&!vis[x-1][y]&&ear[x-1][y]>vis[x][y]+1){ 22 vis[x-1][y]=vis[x][y]+1; if(ear[x-1][y]==INF)return vis[x-1][y]; q.push(make_pair(x-1,y)); 23 } 24 if(!vis[x+1][y]&&ear[x+1][y]>vis[x][y]+1){ 25 vis[x+1][y]=vis[x][y]+1; if(ear[x+1][y]==INF)return vis[x+1][y]; q.push(make_pair(x+1,y)); 26 } 27 if(y>1&&!vis[x][y-1]&&ear[x][y-1]>vis[x][y]+1){ 28 vis[x][y-1]=vis[x][y]+1; if(ear[x][y-1]==INF)return vis[x][y-1]; q.push(make_pair(x,y-1)); 29 } 30 if(!vis[x][y+1]&&ear[x][y+1]>vis[x][y]+1){ 31 vis[x][y+1]=vis[x][y]+1; if(ear[x][y+1]==INF)return vis[x][y+1]; q.push(make_pair(x,y+1)); 32 } 33 } 34 return -1; 35 } 36 int main(){ 37 m=read(); inc(i,0,400)inc(j,0,400)ear[i][j]=INF; 38 inc(i,1,m){ 39 int x=read()+1,y=read()+1,z=read(); 40 inc(i,-1,1)ear[x+i][y]=min(ear[x+i][y],z),ear[x][y+i]=min(ear[x][y+i],z); 41 } 42 printf("%d",bfs()); return 0; 43 }
20160917string