算法----图的遍历(深度优先搜索DFS、广度优先搜索BFS)

图的遍历的定义:
从图的某个顶点出发访问图中所有的点,且每个顶点仅被访问一次。

深度优先搜索DFS:

准备:指定的起始点和终点,确定好当前点与邻接点之间的偏移值、结束搜索的条件、符合访问的点所需条件、回溯处理;

(1)若当前点的邻接点有未被访问的,则选一个进行访问;

(2)若当前点的邻接点都不符合访问条件,退回到当前点的上一个点;

(3)直到访问到目标终点,或是所有点均以访问仍无法到达终点;

前段时间正好帮同学敲一个迷宫的讲解,于是乎。。。

主要代码由C++编写,已附备注

  1 #include <stack>
  2 #include <cstdio>
  3 #include <string>
  4 #include <cstring>
  5 #include <iostream>
  6 
  7 using namespace std;
  8 
  9 typedef struct {
 10     int x, y, step;
 11 }point;
 12 
 13 void out(int a[100][100], int m, int n)    //用于查看迷宫地图
 14 {
 15     int i, j;
 16     for(i = 0; i < m; i++)
 17     {
 18         for(j = 0; j < n; j++)
 19             cout << a[i][j] << " ";
 20         cout << endl;
 21     }
 22 }
 23 
 24 int main()
 25 {
 26     int t, z;
 27     cout << "请输入需要走几个迷宫:" << endl;
 28     while(cin >> t)
 29     {
 30         int m, n;
 31         for(z = 0; z < t; z++)
 32         {
 33             int i, j;
 34             string str;                        //用于输入
 35             stack<point> s;                    //用于保存已走的路径
 36             point start, end;                //起始点和终止点
 37             int map[100][100];                //迷宫地图
 38             int d1[4] = {-1, 0, 1, 0};        //走迷宫的过程中上下方向的偏移值
 39             int d2[4] = {0, 1, 0, -1};        //走迷宫的过程中左右方向的偏移值
 40 
 41             cout << "请输入第" << z+1 << "个迷宫的行列:" << endl;
 42             cin >> m >> n;
 43 
 44             cout << "请输入第" << z+1 << "个迷宫:" << endl;
 45             for(i = 0; i < m; i++)//利用转化的方式,将输入变为数据地图
 46             {
 47                 cin >> str;
 48                 for(j = 0; j < n; j++)
 49                 {
 50                     if(str[j] == 'H')
 51                         map[i][j] = 1;
 52                     if(str[j] == 'O')
 53                         map[i][j] = 0;
 54                 }
 55             }
 56 //            out(map, m, n);    //查看迷宫地图
 57 
 58             cout << "请输入起点坐标和终点坐标:" << endl;
 59             cin >> start.x >> start.y >> end.x >> end.y;
 60 
 61             start.step = 1;
 62             map[start.x][start.y] = -1;    //将起始点在地图上标记出来
 63             s.push(start);
 64             while(!s.empty())
 65             {
 66                 point p = s.top();
 67 
 68                 if(p.x == end.x && p.y == end.y)    //判断是否到达终点
 69                     break;
 70 
 71                 for(i = 0; i < 4; i++)
 72                 {
 73                     int dx = p.x + d1[i];                //下一步的上下位置
 74                     int dy = p.y + d2[i];                //下一步的左右位置
 75 
 76                     if(dx>=0 && dx<m && dy>=0 && dy<n    //判断行走就是否符合地图要求
 77                         && map[dx][dy] == 0)            //判断该点是否可走
 78                     {
 79                         map[dx][dy] = -1;                //走过的点进行标记
 80                         point px;
 81                         px.x = dx, px.y = dy, px.step = p.step+1;
 82                         s.push(px);                        //将这个符合行走条件的点入栈
 83                         break;                            //保证每次只走一步
 84                     }
 85                 }
 86                 if(i == 4)    //当i为4的时候,就是四周都不能走,回溯到上一点
 87                     s.pop();
 88             }
 89             if(s.empty())    //因栈为空而停止循环,当然是无法走出迷宫,不通的
 90             {
 91                 cout << "无法走出迷宫!" << endl;
 92                 continue;
 93             }
 94 //            out(map, m, n);    //查看迷宫地图行走情况,走过为-1,墙为1,未走的路为0
 95 
 96             i = 0;
 97             point *road = new point[m*n];    //用于输出走出迷宫的路径
 98             while(!s.empty())        //读取走过的点
 99             {
100                 point p = s.top();
101                 road[p.step] = p;
102                 s.pop();
103                 i++;
104             }
105             cout << "走出迷宫共用了" << i << "步,经过的点为:";
106             for(i = 1; i < j; i++)
107                 cout << road[i].x << "," << road[i].y << "->";
108             cout << road[i].x << "," << road[i].y << endl;
109 
110         }
111         
112         cout << "请输入需要走几个迷宫:" << endl;
113     }
114     return 0;
115 }

广度优先搜索BFS:

等待更新。。。

猜你喜欢

转载自www.cnblogs.com/AardWolf/p/9987435.html