題目連接ios
這道題難點在於怎麼處理地圖標記問題.能夠這麼處理,在每一個格子裏記錄被流星砸的最先時間,若是這個格子不會被砸到則記爲INF,而後跑bfs的時候加入一個參數來記錄當前跑到第幾步,也就是當前時間爲多少,噹噹前時間now+1<要走格子的時間時(也就是下一步走到這個格子是安全的),就bfs下去,不然則不走,加這個斷定後,當走到INF的格子的時候就能夠結束了,當前時間就是答案.安全
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 const int INF=0x3f3f3f3f; 16 17 struct P 18 { 19 int x,y,t; 20 P (){} 21 P (int x_,int y_,int t_){x=x_,y=y_,t=t_;}; 22 }; 23 int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; 24 int mapp[400][400]; 25 bool used[400][400]; 26 27 void pre(int x,int y,int t) 28 { 29 mapp[x][y]=min(t,mapp[x][y]); 30 for(int i=0;i<4;i++) 31 { 32 int nx=x+dx[i],ny=y+dy[i]; 33 if(nx>=0&&ny>=0) mapp[nx][ny]=min(t,mapp[nx][ny]); 34 } 35 } 36 37 int bfs(void) 38 { 39 queue<P> que; 40 que.push(P(0,0,0)); 41 used[0][0]=true; 42 while(que.size()) 43 { 44 P p=que.front();que.pop(); 45 int x=p.x,y=p.y; 46 for(int i=0;i<4;i++) 47 { 48 int nx=x+dx[i],ny=y+dy[i],nt=p.t+1; 49 if(nx>=0&&ny>=0&&mapp[nx][ny]>nt&&!used[nx][ny]) 50 { 51 if(mapp[nx][ny]==INF) return nt; 52 used[nx][ny]=true; 53 que.push(P(nx,ny,nt)); 54 } 55 } 56 } 57 return -1; 58 } 59 60 int main() 61 { 62 // freopen("black.in","r",stdin); 63 // freopen("black.out","w",stdout); 64 int m; 65 while(scanf("%d", &m) != EOF) 66 { 67 for(int i=0;i<400;i++) 68 for(int j=0;j<400;j++) 69 mapp[i][j]=INF,used[i][j]=false; 70 for(int i=0;i<m;i++) 71 { 72 int x,y,t; 73 scanf("%d %d %d",&x,&y,&t); 74 pre(x,y,t); 75 } 76 printf("%d\n",bfs()); 77 } 78 /* for(int j=10;j>=0;j--) 79 { 80 for(int 81 i=0;i<=10;i++) 82 { 83 printf("%d ",mapp[i][j],i,j); 84 } 85 cout<<endl; 86 } 87 */ return 0; 88 }