POJ 3669 Meteor Shower(BFS)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3669 Meteor Shower(BFS)相关的知识,希望对你有一定的参考价值。
坑点:
1.数组开大点,0-300是流星下落范围
2.maps[tx][ty] = min(maps[tx][ty],t); 流星两次下落同一地方取时间小的
思路:将maps[][] 图上的值作为该点不能走的时间(根据流星下落时间判断5个方向)
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<iostream> 5 using namespace std; 6 7 int maps[400][400]; 8 int dx[] = {-1,0,0,0,1}; 9 int dy[] = {0,-1,0,1,0}; 10 bool vis[400][400]; 11 struct Node{ 12 int x,y,step; 13 Node(int x,int y,int step):x(x),y(y),step(step){} 14 }; 15 queue<Node> que; 16 bool ok(int x,int y,int step){ 17 if(!(x>=0 && y>=0 && x<= 400 & y <= 400)) return false; 18 if(vis[x][y]) return false; 19 if(step >= maps[x][y]) return false; 20 return true; 21 } 22 23 bool bfs(){ 24 que.push(Node(0,0,0)); 25 vis[0][0] = true; 26 while(!que.empty()){ 27 Node tmp = que.front(); que.pop(); 28 int x = tmp.x , y = tmp.y , step = tmp.step; 29 if(maps[x][y] == 0x7f7f7f7f){ 30 printf("%d\n",step); 31 return true; 32 } 33 for(int i = 0 ; i < 5 ; i ++){ 34 int newx = x + dx[i]; 35 int newy = y + dy[i]; 36 if(ok(newx,newy,step+1)){ 37 vis[newx][newy] = true; 38 que.push(Node(newx,newy,step+1)); 39 } 40 } 41 } 42 return false; 43 } 44 45 int main(){ 46 int n; 47 while(scanf("%d",&n)!= EOF && n){ 48 while(!que.empty()) que.pop(); 49 memset(vis,false,sizeof(vis)); 50 memset(maps,0x7f7f7f7f,sizeof(maps)); 51 for(int i = 0 ; i < n ; i ++){ 52 int x,y,t; 53 scanf("%d%d%d",&x,&y,&t); 54 for(int i = 0 ; i < 5 ; i ++){ 55 int tx = x + dx[i]; 56 int ty = y + dy[i]; 57 if(tx>=0 && ty>=0 && tx<= 400 & ty <= 400) 58 maps[tx][ty] = min(maps[tx][ty],t); 59 } 60 } 61 if(maps[0][0] == 0) printf("-1\n"); 62 else if(!bfs()) printf("-1\n"); 63 } 64 65 return 0; 66 }
以上是关于POJ 3669 Meteor Shower(BFS)的主要内容,如果未能解决你的问题,请参考以下文章
poj3669 Meteor Shower (宽度优先搜索)