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)的主要内容,如果未能解决你的问题,请参考以下文章

POJ - 3669Meteor Shower(bfs)

poj3669 Meteor Shower (宽度优先搜索)

POJ3669 Meteor ShowerBFS

bzoj 1611 [Usaco2008 Feb]Meteor Shower流星雨 bfs

流星雨Meteor Shower

Bzoj 1611: [Usaco2008 Feb]Meteor Shower流星雨