1. 程式人生 > >[bfs] Meteor Shower POJ

[bfs] Meteor Shower POJ

1.玩家從原點(0,0)出發 2.有流星在一定時間裡往地圖上砸。砸到以後,這個點以及上下左右共5個點就再也不能行走了(砸以前可以走) 3.玩家每個單位時間必須要上下左右走一格,只能在第一象限中移動 4.找到最短的行走距離,保證這個點是安全的,即所有流星都不會砸到這個點 // 不一定要離開300x300的範圍 讓我楞了好一會 // 重複打擊的點 更新最小值就好 預處理啊預處理 怎麼就楞住了呢 這麼水的題 楞住了// 翻譯完 一直在楞 不知道楞什麼呢

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring> #include <map> #include <queue> #include <set> #include <stack> #include <list> using namespace std; typedef long long ll; #define fir first #define sec second const int maxn = 305 ; const int mod = 1e9+7; const int INF = 0x3f3f3f3f; const double
PI=acos(-1.0); const int cx[]={1,0,-1,0}; const int cy[]={0,1,0,-1}; int n,m,x,y,t; int mp[maxn][maxn]; bool vis[maxn][maxn]; int ans; bool check(int x,int y){return (x>=0&&y>=0);} struct point{ pair<int,int> P; int sp; }tmp,tp; int bfs(){ queue<point> que; que.push(point{
make_pair(0,0),0}); vis[0][0]=1; while(!que.empty()){ tmp=que.front();que.pop(); for(int i=0;i<4;i++){ int nx=tmp.P.fir,ny=tmp.P.sec; nx+=cx[i],ny+=cy[i]; if(check(nx,ny)&&!vis[nx][ny]){ if(mp[nx][ny]==INF) return tmp.sp+1; if(mp[nx][ny]>tmp.sp+1){ vis[nx][ny]=1; que.push(point{make_pair(nx,ny),tmp.sp+1}); } } } } return -1; } int main(){ memset(mp,INF,sizeof(mp)); memset(vis,0,sizeof(vis)); scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d %d %d",&x,&y,&t); mp[x][y]=min(mp[x][y],t); for(int j=0;j<4;j++) if(check(x+cx[j],y+cy[j])) mp[x+cx[j]][y+cy[j]]=min(mp[x+cx[j]][y+cy[j]],t); } printf("%d\n",bfs()); return 0; }