poj 3669 bfs+预处理

来源:互联网 发布:天津哪里有mac专柜 编辑:程序博客网 时间:2024/06/06 05:17

点击打开链接

#include <iostream>#include <algorithm>#include <cstring>#include <queue>using namespace std;const int MAX=305;typedef struct{int x;int y;}Move;Move move[4]={{-1,0},{1,0},{0,-1},{0,1}};struct Node{int x;int y;int t;Node(int x1,int y1,int t1):x(x1),y(y1),t(t1){}};queue<Node> q; //到达该点的最短时间 int time[MAX][MAX],visit[MAX][MAX];// meteor落到 (i,j)的最早时间  若time[i][j]=-1 则为安全点 bool bfs() //从0点走到安全点的最短时间 {q.push(Node(0,0,0));visit[0][0]=1;while(!q.empty()){Node n=q.front();q.pop();int x=n.x,y=n.y;if(time[x][y]==1<<11) //到达安全点 {cout<<n.t;return 1;}for(int i=0;i<4;i++){int a=x+move[i].x;int b=y+move[i].y;if(a>=0&&a<MAX&&b>=0&&b<MAX&&!visit[a][b])  {int tmp=n.t+1;if(tmp>=time[a][b]) //不能走到已经被meteor destory的点{continue;}visit[a][b]=1;q.push(Node(a,b,tmp));}}}return false;}int main(){int m,a,b,x,y,t;cin>>m;memset(visit,0,sizeof(visit));for(int i=0;i<MAX;i++){for(int j=0;j<MAX;j++){time[i][j]=1<<11; //没被 meteor砸到的点 }}for(int i=0;i<m;i++){cin>>x>>y>>t;time[x][y]=min(time[x][y],t); // meteor到(x,y)的最早下落时间 (时间t大于等于time[x][y]则不能走该点)for(int j=0;j<4;j++){a=x+move[j].x;b=y+move[j].y;if(a>=0&&a<MAX&&b>=0&&b<MAX){time[a][b]=min(time[a][b],t);}}}if(time[0][0]==0||!bfs()){cout<<-1<<endl;}return 0;}


0 0