BFS和DFS记录路径

 DFS记录路径的意义好像不大,因为不一定是最短的,但是实现起来却很简单。

 1 #include<math.h>
 2 #include<stdio.h>
 3 #include<queue>
 4 #include<string.h>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 #define N 1234
 9
10
11 int n,m,step;
12 int dx[]={0,0,1,-1};
13 int dy[]={1,-1,0,0};
14 char mat[N][N];
15 int  vis[N][N];
16 int    a[2][N];
17
18 void dfs(int x,int y,int t)
19 {
20     if(step!=-1)return;
21     if(x<1||x>n||y<1||y>m)return;
22     if(mat[x][y]==‘#‘||vis[x][y])return;
23     if(mat[x][y]==‘r‘)
24     {
25         step=t;
26         a[0][t]=x;
27         a[1][t]=y;
28         return ;
29
30     }
31     vis[x][y]=1;
32 //    printf("(%d,%d)\n",x,y);
33     a[0][t]=x;
34     a[1][t]=y;
35     for(int i=0;i<4;i++)
36         dfs(x+dx[i],y+dy[i],t+1);
37 }
38 int main()
39 {
40     while(~scanf("%d%d",&n,&m))
41     {
42         int stx,sty;
43         step=-1;
44         memset(vis,0,sizeof(vis));
45         for(int i=1;i<=n;i++)
46             for(int j=1;j<=m;j++)
47             {
48                 scanf(" %c",&mat[i][j]);
49                 if(mat[i][j]==‘a‘)
50                     stx=i,sty=j;
51             }
52         dfs(stx,sty,0);
53         if(step==-1)puts("Poor ANGEL has to stay in the prison all his life.");
54         else
55         {
56             cout<<step<<endl;
57             puts("Path");
58             for(int i=0;i<=step;i++)
59                 printf("%d,%d\n",a[0][i],a[1][i]);
60         }
61
62     }
63     return 0;
64 }
65
66
67 /*
68
69 7 8
70 #.#####.
71 #.a#..r.
72 #..#....
73 ..#..#.#
74 #...##..
75 .#......
76 ........
77 */

BFS记录路径:我的方法是每一个点都保存一下它从哪个方向走过来的(也就是那个i),这样由最后一个点,就可以倒推出倒数第二个点,倒数第二个点再可以推出倒数第三个点,最后推到起点,再反过来,就是路径了。

  1 #include<math.h>
  2 #include<stdio.h>
  3 #include<queue>
  4 #include<string.h>
  5 #include<iostream>
  6 #include<algorithm>
  7 using namespace std;
  8 #define N 1234
  9 struct point
 10 {
 11     int x,y,t,dir;
 12 }st;
 13
 14 int n,m,step;
 15 int dx[]={0,0,1,-1};
 16 int dy[]={1,-1,0,0};
 17 char mat[N][N];
 18 int  vis[N][N];
 19 int  xx[N];
 20 int  yy[N];
 21 int  d[N][N];
 22
 23 int bfs()
 24 {
 25     queue<point>q;
 26     q.push(st);vis[st.x][st.y]=1;
 27     while(!q.empty())
 28     {
 29         point cur=q.front();
 30         q.pop();
 31         for(int i=0;i<4;i++)
 32         {
 33             point next=cur;
 34             next.x+=dx[i];next.y+=dy[i];
 35
 36             if(next.x<1||next.x>n||next.y<1||next.y>m)continue;
 37             if(mat[next.x][next.y]==‘#‘||vis[next.x][next.y]==1)continue;
 38
 39             d[next.x][next.y]=i;
 40
 41             if(mat[next.x][next.y]==‘.‘)next.t=next.t+1;
 42             if(mat[next.x][next.y]==‘r‘)
 43             {
 44                 xx[0]=next.x;
 45                 yy[0]=next.y;
 46                 step=next.t+1;
 47                 return step;
 48             }
 49             q.push(next);vis[next.x][next.y]=1;
 50         }
 51     }
 52     return -1;
 53 }
 54 int main()
 55 {
 56     while(~scanf("%d%d",&n,&m))
 57     {
 58         step=0;
 59         memset(vis,0,sizeof(vis));
 60         for(int i=1;i<=n;i++)
 61             for(int j=1;j<=m;j++)
 62             {
 63                 scanf(" %c",&mat[i][j]);
 64                 if(mat[i][j]==‘a‘)
 65                     st.x=i,st.y=j,st.t=0;
 66             }
 67         int ans=bfs();
 68         if(ans==-1)puts("Poor ANGEL has to stay in the prison all his life.");
 69         else
 70         {
 71             cout<<ans<<endl;
 72
 73
 74             for(int i=1;i<=step;i++)
 75             {
 76                 xx[i]=xx[i-1] - dx[ d[ xx[i-1] ][ yy[i-1] ] ];
 77                 yy[i]=yy[i-1] - dy[ d[ xx[i-1] ][ yy[i-1] ] ];
 78             }
 79             puts("Path");
 80             for(int i=step;i>=0;i--)
 81             {
 82                 printf("%d,%d\n",xx[i],yy[i]);
 83             }
 84         }
 85
 86     }
 87     return 0;
 88 }
 89
 90
 91 /*
 92
 93 7 8
 94 #.#####.
 95 #.a#..r.
 96 #..#....
 97 ..#..#.#
 98 #...##..
 99 .#......
100 ........
101
104 */
时间: 2024-10-29 19:07:07

BFS和DFS记录路径的相关文章

哈密顿绕行世界问题(dfs+记录路径)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2362    Accepted Submission(s): 1490 Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的

UVA 624 CD (01背包+打印路径 或 dfs+记录路径)

Description You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is on CDs. You need to have it on tapes so the problem to solve is: you have a tape N minutes long. How to choose tracks from CD to get most o

历届试题 危险系数-(dfs+记录路径)

历届试题 危险系数 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个危险系数DF(x,y): 对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点.相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数. 本题的任务是:已知网络结构,求两站点之间的危险系数.

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

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 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>

poj1416——dfs递归枚举+记录路径

POJ 1416  dfs递归枚举+记录路径 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4456   Accepted: 2555 Description You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" s