回溯法之迷宫最短路径,c++实现

回溯法之迷宫最短路径,c++实现

迷宫的算法很多,但是解释原理的却很少,在这里我利用自己的亲身经历来讲解一下求解迷宫的原理

  1. 迷宫求解可以利用栈结构,即深度优先,探索一个位置就标记,通则走
  2. 不通则后退寻找下一个位置,可以求出通路,简单但是不一定是最短路径
  3. 这里求最短路径利用的是广度优先的思想,什么是广度优先,利用队列实现,一个元素出队
  4. 然后访问这个元素相邻的所有元素,原理是,一个二维数组,0表示墙,1表示路,这里我利用随机数生成0和1,4个方向
  5. 在广度优先算法的思想下,队头元素出队,然后广度依次访问他的4个方向,依次入队,并记下他们的前一个坐标在队列中的位置
  6. 重复直到出对的是终点,在找到终点后,利用每一个位置都有前一个坐标在队列中的下标进行回访,访问到起点即走了一遍找到的路径,此时便可正向输出路径即可。

回溯法之迷宫最短路径,c++实现_第1张图片
广度优先访问的过程就是,假设现在队头是5,5出队后,访问5的相邻元素,即将6,8,4,2入队,这里是顺时针方向,一次类推。
假设这里9个元素全部是路,一开始1入队,然后1出队,访问四周,2,4依次入队,前一个坐标是1,2出队,3,5入队,前一个坐标是2,4出队,7入队,前一个坐标是4,3出队,6入队,前一坐标是3,5出队,8入队,前一坐标是8,6出队,9入队,前一坐标是6,访问了终点9,结束入队,从9开始回访,9->6->3->2->1 即找到最短路径。

#include
#include
#include
using namespace std;
struct Node
{
    int data;
    int flag;
};
struct Path
  {
  int xpath;
  int ypath;
  int pox;    //在队列中的下标 
  };

  class Maze
  {
  private:
      int n, m;     //迷宫的行和列 
      Node *maze;   //迷宫存放 
      Path *que;
      int top = -1;
      int front = -1;
      int rear = -1;
  public:
    
    void create()
    {
        int i, j;
        cout<<"输入迷宫的行和列:";
        cin>>n>>m;
        maze = new Node[n*m];
        srand(time(NULL));
        for(i = 0; i=0)
                push_road(x,y-1);
            if(x-1>=0)
                push_road(x-1,y);
        }    
        cout<<"没有通路!!"<create();
  ma->seek_road();
  return 0;
} 

ps:这是个人学习过程中得体会,如果有错误得地方,欢迎留言提醒,定会及时修改,如果觉得有帮助,可以加个关注,后面还会有其他算法得原理分析和代码,也可私聊我哦

你可能感兴趣的:(算法c++)