hdu 1026 bfs+记录路径

题意:从0,0点出发到n-1,m-1点,路上的数字代表要在这个点额外待多少秒,求最短的路

递归输出路径即可

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<map>
  8 using namespace std;
  9 #define MOD 1000000007
 10 const int INF=0x3f3f3f3f;
 11 const double eps=1e-5;
 12 #define cl(a) memset(a,0,sizeof(a))
 13 #define ts printf("*****\n");
 14 const int MAXN=1005;
 15 int n,m,tt;
 16 int sumt=0;
 17 struct node
 18 {
 19     int x,y,t;
 20     node(){}
 21     node(int xx,int yy,int tt)
 22     {
 23         x=xx,y=yy,t=tt;
 24     }
 25     friend bool operator<(node a,node b)
 26     {
 27         return a.t>b.t;
 28     }
 29 };
 30 bool vis[MAXN][MAXN];
 31 int dir[MAXN][MAXN];
 32 char maze[MAXN][MAXN];
 33 int d[4][2]={0,1,1,0,-1,0,0,-1};
 34 int kk=0;
 35 int outpath(int x,int y)    //递归输出,从x,y出发所在的时间
 36 {
 37     if(x==0&&y==0)
 38     {
 39         int nt=1;
 40         printf("%ds:(%d,%d)->",nt,x,y);
 41         return nt;
 42     }
 43     else
 44         kk=dir[x][y];
 45     int nt=outpath(x-d[kk][0],y-d[kk][1]);
 46     printf("(%d,%d)\n",x,y);
 47     if(0<maze[x][y]-‘0‘&&maze[x][y]-‘0‘<=9)
 48     {
 49         int l=maze[x][y]-‘0‘;
 50         while(l--)
 51         printf("%ds:FIGHT AT (%d,%d)\n",++nt,x,y);
 52     }
 53     if(nt==sumt) return 0;
 54     printf("%ds:(%d,%d)->",++nt,x,y);
 55     return nt;
 56 }
 57 void bfs()
 58 {
 59     node now,next;
 60     priority_queue<node> q;
 61     q.push(node(0,0,0));
 62     vis[0][0]=1;
 63     while(!q.empty())
 64     {
 65         now=q.top();
 66         q.pop();
 67         if(now.x==n-1&&now.y==m-1)
 68         {
 69             printf("It takes %d seconds to reach the target position, let me show you the way.\n",now.t);
 70             sumt=now.t;
 71             outpath(n-1,m-1);
 72             printf("FINISH\n");
 73             return;
 74         }
 75         for(int i=0;i<4;i++)
 76         {
 77             next.x=now.x+d[i][0];
 78             next.y=now.y+d[i][1];
 79             next.t=now.t+1;
 80             if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&!vis[next.x][next.y]&&maze[next.x][next.y]!=‘X‘)
 81             {
 82                 if(‘0‘<maze[next.x][next.y]&&maze[next.x][next.y]<=‘9‘)
 83                 {
 84                     next.t+=maze[next.x][next.y]-‘0‘;
 85                     vis[next.x][next.y]=1;
 86                     dir[next.x][next.y]=i;
 87                     q.push(next);
 88                 }
 89                 else
 90                 {
 91                     dir[next.x][next.y]=i;
 92                     vis[next.x][next.y]=1;
 93                     q.push(next);
 94                 }
 95             }
 96         }
 97     }
 98     puts("God please help our poor hero.\nFINISH");
 99 }
100 int main()
101 {
102     int i,j,k;
103     #ifndef ONLINE_JUDGE
104     freopen("1.in","r",stdin);
105     #endif
106     while(scanf("%d%d",&n,&m)!=EOF)
107     {
108         for(i=0;i<n;i++)
109         {
110             scanf("%s",maze[i]);
111         }
112         cl(vis);
113         bfs();
114     }
115 }
时间: 2024-10-10 08:02:24

hdu 1026 bfs+记录路径的相关文章

HDU1026--Ignatius and the Princess I(BFS记录路径)

Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem simply, we assume the labyrint

SDUT2465其实玩游戏也得学程序(BFS记录路径问题)

BFS记录路径第一炮 题目连接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2465 思路:搜索找路径问题,DFS进行,调用     DFS(当前->当前点父节点)->起点,思想,以栈为储存结构,保存路径. 和以往BFS不一样的是地图储存在结构体里...注意 在DFS时候,BLF0是当前点的父节点,BLF1是其子节点,因为初始时cost是无限大,每次进出队列的过程都保证当前的cost是较小

poj 3984 迷宫问题 (BFS+记录路径)

题目连接:http://poj.org/problem?id=3984 题解:简单的BFS+记录路径,具体题解看代码注释. #include <iostream> #include <queue> #include <cstdio> using namespace std; struct point { int x; int y; }; queue<point>q; int map[5][5]; int vis[5][5];//标记走过的路 int g[4]

hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要花费1s+数字大小的时间. 比较麻烦的是需要记录路径.还要记录是在走路还是在打怪. 因为求最短路,所以可以使用bfs. 因为进过每一个点花费时间不同,所以可以使用优先队列. 因为需要记录路径,所以需要开一个数组,来记录经过节点的父节点.当然,记录方法不止一种. 上代码—— 1 #include <c

HDU 1026 Ignatius and the Princess I(bfs +记录路径)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14184    Accepted Submission(s): 4474 Special Judge Problem Description The Princess has been abducted by the BEelzeb

hdu 1226 BFS + bfs记录路径

http://acm.hdu.edu.cn/showproblem.php?pid=1226 为了省空间,可以用vis数组初始化的时候初始化为-1, 发现一个BFS容易错的地方 开始一直WA在这里:就是我int tp=q.front();之后马上q.pop():了,然后才去判断是不是符合条件以break,这样就不能根据q.empty()==1认为没有找到ans 因为这里WA了 其实也可以vis[0] == -1来判断 比较不理解的是 当n==0的时候 %n==0的时候怎么处理 //#pragma

学霸的迷宫(BFS+记录路径)

1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置

(简单) POJ 3414 Pots,BFS+记录路径。

Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap; DROP(i)      empty the pot i to the drain; POUR(i,j)    pour from

poj1426 - Find The Multiple [bfs 记录路径]

传送门 转:http://blog.csdn.net/wangjian8006/article/details/7460523 (比较好的记录路径方案) 1 #include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue>