首页 > 代码库 > poj 3669 Meteor Shower
poj 3669 Meteor Shower
http://poj.org/problem?id=3669
题意:
给定几个坐标,在这些坐标上 t 时刻会有陨石雨,上下左右也被损坏。怎样在最短的时间内找到一个安全的地方。
思路:预处理每个陨石下落的周围的点,然后bfs就可以。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 #define maxn 50000 6 using namespace std; 7 8 int n; 9 int ans,max1;10 int vis[400][400];11 int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};12 struct node13 {14 int x,y;15 int t;16 }p[maxn],st1,st2;17 18 void bfs(int x,int y)19 {20 queue<node>q;21 st1.x=x;22 st1.y=y;23 st1.t=0;24 if(vis[x][y]==0)25 {26 return;27 }28 q.push(st1);29 while(!q.empty())30 {31 st2=q.front(); q.pop();32 if(vis[st2.x][st2.y]==-1)33 {34 ans=st2.t;35 return ;36 }37 for(int i=0; i<5; i++)38 {39 int x1=st2.x+dir[i][0];40 int y1=st2.y+dir[i][1];41 if(!(x1>=0&&y1>=0)) continue;42 if((vis[x1][y1]>st2.t+1)||(vis[x1][y1]==-1))43 {44 if(vis[x1][y1]!=-1)45 {46 vis[x1][y1]=st2.t+1;47 }48 st1.x=x1;st1.y=y1;49 st1.t=st2.t+1;50 q.push(st1);51 }52 }53 }54 }55 56 int main()57 {58 while(scanf("%d",&n)!=EOF)59 {60 ans=-1;61 memset(vis,-1,sizeof(vis));62 for(int i=1; i<=n; i++)63 {64 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].t);65 for(int j=0; j<5; j++)66 {67 int xx=p[i].x+dir[j][0];68 int yy=p[i].y+dir[j][1];69 if(!(xx>=0&&yy>=0)) continue;70 if(vis[xx][yy]==-1)71 {72 vis[xx][yy]=p[i].t;73 }74 else75 {76 vis[xx][yy]=min(vis[xx][yy],p[i].t);77 }78 }79 }80 bfs(0,0);81 printf("%d\n",ans);82 }83 return 0;84 }
poj 3669 Meteor Shower
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。