hdu1026 BFS+记录路径
2013-05-04 13:05
323 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1026
用的普通的队列
由于一些点打怪物要占据一定的时间,要注意进队条件,(最基本的广搜只是层次遍历,每次取队头,然后其相邻的点进队,同时已经进队的做标记,是不可取的)如果某一点能提供一条更短的路则进队,所以某些点不止搜索了一次
测试数据
5 7
...X...
.X.X.X.
.X...X.
.XXXXX.
....9..
用的普通的队列
由于一些点打怪物要占据一定的时间,要注意进队条件,(最基本的广搜只是层次遍历,每次取队头,然后其相邻的点进队,同时已经进队的做标记,是不可取的)如果某一点能提供一条更短的路则进队,所以某些点不止搜索了一次
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define MAX 105 #define INF 0x3f3f3f3f char map[MAX][MAX]; int n,m,t[MAX][MAX],fa[MAX][MAX]; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; typedef struct { int x,y; }Node; void bfs() { queue<Node>q; Node node={0,0}; q.push(node); while(!q.empty()) { node=q.front(); q.pop(); int x=node.x; int y=node.y; for(int i=0;i<4;i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]=='.') { if(t[tx][ty]>t[x][y]+1) { t[tx][ty]=t[x][y]+1; fa[tx][ty]=i;//记录如何由上一点找到该点的 node.x=tx; node.y=ty; q.push(node); } } if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]>='1'&&map[tx][ty]<='9') { int k=map[tx][ty]-'0'; if(t[tx][ty]>t[x][y]+k+1) { t[tx][ty]=t[x][y]+k+1; fa[tx][ty]=i; node.x=tx; node.y=ty; q.push(node); } } } } } int main() { int i; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%s",map[i]);//图 } memset(t,INF,sizeof(t));//初始化时间 t[0][0]=0; bfs(); /*for(i=0;i<n;i++) { for(int j=0;j<m;j++) cout<<t[i][j]<<" "; cout<<endl; } cout<<endl;*/ if(t[n-1][m-1]==INF)//无法到终点 { cout<<"God please help our poor hero."<<endl<<"FINISH"<<endl; continue; } printf("It takes %d seconds to reach the target position, let me show you the way.\n",t[n-1][m-1]); int x=n-1,y=m-1,trace[MAX*MAX][2],c=2; trace[1][0]=x,trace[1][1]=y; while(!(x==0&&y==0))//由终点开始逆向存储路径,trace中最后一个是起点 { i=fa[x][y]; int fx=x-dx[i];//父亲点 int fy=y-dy[i]; trace[c][0]=fx; trace[c++][1]=fy; x=fx;y=fy; } int k=1; for(i=c-1;i>=1;i--)//由起点开始到终点,要循环到终点,因为终点可能有怪物,有FIGHT时间 { x=trace[i][0],y=trace[i][1]; if(map[x][y]>='1'&&map[x][y]<='9') { int tt=map[x][y]-'0'; for(int j=1;j<=tt;j++) { printf("%ds:FIGHT AT (%d,%d)\n",k++,x,y); } } if(i!=1) printf("%ds:(%d,%d)->(%d,%d)\n",k++,trace[i][0],trace[i][1],trace[i-1][0],trace[i-1][1]); } cout<<"FINISH"<<endl; } return 0; }
测试数据
5 7
...X...
.X.X.X.
.X...X.
.XXXXX.
....9..
相关文章推荐
- poj3984 迷宫问题(简单搜索+记录路径)
- poj 2488A Knight's Journey(搜索 记录路径)
- POJ 3984 记录路径的BFS
- hdu 1026 Ignatius and the Princess I bfs 优先队列 路径记录
- 关于tomcat的路径(WEB-INF)的一些路径的记录
- Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)
- POJ 1719 二分图最大匹配(记录路径)
- 实验室进度记录之matlab描绘提取到的路径
- 宽度优先搜索(记录路径)
- 【记录开发中遇到问题】修改xcode安装目录后终端找不到路径方法
- poj 迷宫问题(路径记录)(DFS,BFS)
- 记录我学Qt的点点滴滴(一、获取文件路径、设置字体、颜色)
- hdu 4871 树的分治+最短路记录路径
- bfs poj 3984 记录路径
- hihoCoder 1394 : 网络流四·最小路径覆盖 (网络流学习#4 记录)
- hdu 1664(数论+同余搜索+记录路径)
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
- poj-3414-Pots【BFS+记录路径】
- 新年趣事之打牌(01背包+记录路径)
- 匈牙利算法改进 之 队列优化寻找极大增广路径集 —— Hopcroft-Karp算法 【记录】