宽度优先搜索(BFS):POJ3669--Meteor Shower
2016-08-15 17:06
183 查看
本题题意为:陨石落下会砸坏第一象限方块,周围的四个方块也会损坏。你只能在当前完好的方块上逃离,问你能不能逃脱,最短时间是多少?显然这题类似于迷宫问题,求最短路径,一道基本广搜题。应该注意,不可随意的以为到达每个点的时间为x+y,因为像迷宫一样,路可以绕着走。所以时间必须要记录下来。此外,方块何时被损坏是一个要不断更新的过程。原题链接
#include <iostream> #include <cstring> #include <queue> #define MAX_X 302 #define MAX_Y 302 #define INF 0x4f4f4f4f ///int类型时4个字节,所以用4个4f,以便使用memset函数(用字节填充) using namespace std; typedef pair<int,int> P; const int xi[]={1,0,-1,0}; const int yi[]={0,1,0,-1}; int data[MAX_X][MAX_Y]; ///记录损坏的最先时间 int used[MAX_X][MAX_Y]; ///第一次被使用的时间(记录是第几步到达的) void bfs(){ queue<P> que; used[0][0]=0; ///设原点为第0步 que.push(P(0,0)); ///加入队列第1点 while(!que.empty()){ P tmp=que.front(); int x=tmp.first,y=tmp.second; if(data[x][y]==INF){ ///找到安全点 cout<<used[x][y]<<endl; return ; } que.pop(); for(int i=0;i<4;i++){ int xx=x+xi[i],yy=y+yi[i]; if(data[xx][yy]>used[x][y]+1&&used[xx][yy]>used[x][y]+1&&xx>=0&&yy>=0){ used[xx][yy]=used[x][y]+1; ///步数加1 que.push(P(xx,yy)); } } } cout<<-1<<endl; ///已被坏的方块包围!!! } int main() { int n; cin>>n; memset(data,0x4f,sizeof(data)); ///初始化填充数据 memset(used,0x4f,sizeof(used)); for(int i=0;i<n;i++){ ///输入数据 int x,y,t; cin>>x>>y>>t; data[x][y]=min(data[x][y],t); ///如果在data[x][y]之前已经损坏,更新自身 for(int i=0;i<4;i++) if(x+xi[i]>=0&&y+yi[i]>=0) data[x+xi[i]][y+yi[i]]=min(data[x+xi[i]][y+yi[i]],t); ///更新相邻节点 } if (data[0][0]==0) cout<<-1<<endl; else bfs(); return 0; }
相关文章推荐
- 图的宽度优先搜索(BFS)以及C++队列知识复习
- 算法学习笔记10-BFS宽度优先搜索
- poj 3278(bfs宽度优先搜索)
- 广度/宽度优先搜索(BFS)
- 【算法入门】广度/宽度优先搜索(BFS)
- 宽度优先搜索(BFS)
- 【算法入门】广度/宽度优先搜索(BFS)
- 宽度优先搜索BFS
- 2.1.5 宽度优先搜索(BFS) (《挑战程序设计竞赛》)
- 【算法入门】广度/宽度优先搜索(BFS)
- BFS 宽度优先搜索——初学
- 广度/宽度优先搜索(BFS)详解
- 广度/宽度优先搜索(BFS)
- 【算法入门】广度/宽度优先搜索(BFS)
- 广度/宽度优先搜索(BFS)
- ZOJ3376 Safest Points [几何(geometry), 宽度优先搜索(bfs)]
- 穿越雷区--bfs宽度优先搜索
- POJ 3626 Mud Puddles 练习 BFS 宽度优先搜索
- 广度/宽度优先搜索(BFS)
- 【算法入门】广度/宽度优先搜索(BFS)