Meteor Shower POJ 3669(搜索)

原题

题目链接

题目分析

这道题难点在于怎么处理地图标记问题.可以这么处理,在每个格子里记录被流星砸的最早时间,如果这个格子不会被砸到则记为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 }  

猜你喜欢

转载自www.cnblogs.com/VBEL/p/11396679.html