一.题目描述:
二.解题思路:
首先建立一个数组记录流星砸下的位置以及时间,当有相同地方砸下的流星时我们只取最小的那个时间,然后从0,0开始进行bfs即可,如果不能走了,说明Bessie逃不出去,如果他在走的过程中碰到了一个没有被砸过的点,那么这个点一定是花费最小步数的安全点。唯一需要注意的是,流星砸下的坐标范围不是我走到安全区域的坐标范围,所以最大坐标可以不用判断。(注意审题,我被这个wa了五发)
三.代码实现:
1 #include "bits/stdc++.h" 2 using namespace std; 3 char mp[350][350]; 4 int bkf[350][350]; 5 int bk[350][350]; 6 int mv[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 7 int x,y,t; 8 struct node { 9 int x1; 10 int y1; 11 int t1; 12 }; 13 int bfs(int sx,int sy) 14 { 15 queue <node> ans; 16 node u; 17 u.x1 = sx; 18 u.y1 = sy; 19 u.t1 = 0; 20 ans.push(u); 21 bk[sx][sy] = 1; 22 while(!ans.empty()){ 23 node v = ans.front(); 24 ans.pop(); 25 if(mp[v.x1][v.y1] != 'f') return v.t1; 26 if(v.t1 >= 1001) break; 27 for(int i = 0;i < 4;i++){ 28 int dx = v.x1 + mv[i][0]; 29 int dy = v.y1 + mv[i][1]; 30 int dt = v.t1 + 1; 31 if(dx < 0 || dy < 0 ) continue; 32 if(bk[dx][dy] || (mp[dx][dy] == 'f' && bkf[dx][dy] <= dt)) continue; 33 node w; 34 bk[dx][dy] = 1; 35 w.x1 = dx; 36 w.y1 = dy; 37 w.t1 = dt; 38 ans.push(w); 39 } 40 } 41 return -1; 42 } 43 int main() 44 { 45 int m; 46 cin >> m; 47 for(int i = 1;i <= m;i++){ 48 cin >> x >> y >> t; 49 if(mp[x][y] != 'f' || (mp[x][y] == 'f' && bkf[x][y] > t)){ 50 mp[x][y] = 'f'; 51 bkf[x][y] = t; 52 } 53 for(int j = 0;j < 4;j++){ 54 int dx = x + mv[j][0]; 55 int dy = y + mv[j][1]; 56 int ds = t; 57 if(dx < 0 || dy < 0) continue;//题目意思是流星不能砸出300,但是人却可以走出300,我wa最后一个点五次了orz! 58 if(mp[dx][dy] == 'f' && bkf[dx][dy] <= ds) continue; 59 mp[dx][dy] = 'f'; 60 bkf[dx][dy] = ds; 61 } 62 } 63 cout << bfs(0,0); 64 return 0; 65 }