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