POJ 3669 Meteor Shower BFS
题意:
M个陨石会在某个时间砸向地图某点,摧毁该点及其上下左右总共五个格子,也就是在这个时间以后这些格子就不能通过了,问主人公从(0,0)开始最少需要多少时间能到达安全的地方(也就是一直不会被摧毁的地方)
此题有个小陷阱,with meteor i will striking point (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300) at time Ti (0 ≤ Ti ≤ 1,000). 这里的X、Y指的是陨石的范围而不是地图的范围,地图是一张无限大的,也就是可以走到300以外地方。
先初始化所以格子的崩塌时间为INF(无限大),然后预处理出所有的时间,再跑一遍BFS就行了
// #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath> #include<climits> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<set> using namespace std; typedef long long ll; typedef pair<int,int> pii; #define pb(a) push_back(a) #define INF 0x1f1f1f1f #define lson idx<<1,l,mid #define rson idx<<1|1,mid+1,r void debug() { #ifdef ONLINE_JUDGE #else freopen("d:\\in.txt","r",stdin); freopen("d:\\out1.txt","w",stdout); #endif } char getch() { char ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!='\n')return ch; } return EOF; } int da[310][310];//存放崩塌时间int vis[310][310]; int dx[]={-1,0,1,0}; int dy[]={0,1,0,-1}; struct point { int x,y,t; }; int bfs() { queue<point> q; q.push((point){0,0,0}); while(!q.empty()) { point p=q.front();q.pop(); if(da[p.x][p.y]==INF)return p.t; if(vis[p.x][p.y])continue; vis[p.x][p.y]=1; for(int d=0;d<4;d++) { point np; np.x=p.x+dx[d];np.y=p.y+dy[d];np.t=p.t+1; //边界要大于等于302 if(np.x>=0&&np.x<=305&&np.y>=0&&np.y<=305&&da[np.x][np.y]>np.t&&!vis[np.x][np.y]) { q.push(np); } } } return -1; } int main() { int m; while(scanf("%d",&m)!=EOF) { //预处理部分 memset(da,INF,sizeof(da)); for(int i=1;i<=m;i++) { int x,y,t; scanf("%d%d%d",&x,&y,&t); if(da[x][y]>t)da[x][y]=t; for(int d=0;d<4;d++) { int nx=x+dx[d],ny=y+dy[d]; if(nx>=0&&nx<=305&&ny>=0&&ny<=305&&da[nx][ny]>t)da[nx][ny]=t; } } memset(vis,0,sizeof(vis)); int flag=bfs(); printf("%d\n",flag); } return 0; }