版权声明:学习交流为主,未经博主同意禁止转载,禁止用于商用。          https://blog.csdn.net/u012965373/article/details/26376987        </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div class="htmledit_views" id="content_views">

关于搜索我做了一个整理这里用到的是深度搜索还有回溯算法。

意思是按着一个方向找如果没有依次返回。

http://www.cnblogs.com/hustcat/archive/2008/04/09/1144645.html

这里有位大师的讲解不错!

计算机解迷宫时,通常用的是"试探和回溯"的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止,如果所有可能的通路都试探过,还是不能走到终点,那就说明该迷宫不存在从起点到终点的通道。

  1.从入口进入迷宫之后,不管在迷宫的哪一个位置上,都是先往东走,如果走得通就继续往东走,如果在某个位置上往东走不通的话,就依次试探往南、往西和往北方向,从一个走得通的方向继续往前直到出口为止;

  2.如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通;
   
   3.所谓"走不通"不单是指遇到"墙挡路",还有"已经走过的路不能重复走第二次",它包括"曾经走过而没有走通的路"。显然为了保证在任何位置上都能沿原路退回,需要用一个"后进先出"的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后,栈中保存的正是一条从入口到出口的路径。

由此,求迷宫中一条路径的算法的基本思想是:
若当前位置"可通",则纳入"当前路径",并继续朝"下一位置"探索;若当前位置"不可通",则应顺着"来的方向"退回到"前一通道块",然后朝着除"来向"之外的其他方向继续探索;若该通道块的四周四个方块均"不可通",则应从"当前路径"上删除该通道块。

设定当前位置的初值为入口位置; 
  do{
    若当前位置可通, 
    则{
     将当前位置插入栈顶;       // 纳入路径 
     若该位置是出口位置,则算法结束; 
      // 此时栈中存放的是一条从入口位置到出口位置的路径
     否则切换当前位置的东邻方块为新的当前位置; 
     }
    否则
    {
    若栈不空且栈顶位置尚有其他方向未被探索, 
    则设定新的当前位置为: 沿顺时针方向旋转找到的栈顶位置的下一相邻块;
    若栈不空但栈顶位置的四周均不可通, 
    则{ 删去栈顶位置;         // 从路径中删去该通道块
      若栈不空,则重新测试新的栈顶位置, 
      直至找到一个可通的相邻块或出栈至栈空; 
     } 
   } 
} while (栈不空);

#include <cstdio>
#include <iostream>
#define WALL   0  //墙
#define CORRIDOR 1 //通道
#define PATH  9 //为路径上的一块
#define TRIED 2 //

#define ROW_NUM    7 //迷宫数组行数
#define COL_NUM   13 //列数

#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
typedef struct 
{
    int row;
    int col;
}PosType;

typedef struct 
{
    int ord;      //通道块在路径上的"序号"
    PosType seat; //通道块在迷宫中的坐标
    int di;       //当前通道块的方向
}SElemType;
typedef struct 
{
    SElemType S[MAXSIZE];
    int top;
}MazeType;
//迷宫
int grid[ROW_NUM][COL_NUM]={{1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1},
                            {1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1},
                            {1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1},
                            {1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},
                            {1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0},
                            {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
                            {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
//当前位置是否可以通过
bool Valid(PosType pos)
{
    if(pos.row>=0&&pos.row<=ROW_NUM&&pos.col>=0&&pos.col<=COL_NUM&&grid[pos.row][pos.col]==CORRIDOR)
        return TRUE;
    else
        return FALSE;
}
void FootPrint(PosType pos)//留下足迹
{
    grid[pos.row][pos.col]=PATH;
}
void Undo(PosType pos) //留下不能通过的标识
{
    grid[pos.row][pos.col]=TRIED;
}
//当前位置的下一个位置
PosType NextPos(PosType cur,int di)
{
    PosType next;
    switch(di)
    {
    case 0: //东
        next.row=cur.row;
        next.col=cur.col+1;
        break;
    case 1: //南
        next.row=cur.row+1;
        next.col=cur.col;
        break;
    case 2:  //西
        next.row=cur.row;
        next.col=cur.col-1;
        break;
    case 3:  //北
        next.row=cur.row-1;
        next.col=cur.col;
        break;
    }
    return next;
}
//是否到达终点
bool Done(PosType cur,PosType end)
{
    if(cur.row==end.row&&cur.col==end.col)
        return TRUE;
    else
        return FALSE;
}
//寻找迷宫路径
bool MazePath(MazeType &path,PosType start,PosType end)
{
    SElemType e;
    path.top=-1;
    int step=1;
    PosType curpos=start;
    do
    {
        if(Valid(curpos))
        {
            FootPrint(curpos);
            e.ord=step;
            e.di=0;
            e.seat=curpos;
            path.S[++path.top]=e;
            if(Done(curpos,end))
                return TRUE;
            curpos=NextPos(curpos,0);
            step++;
        }
        else
        {
            if(path.top>-1)//棧不空
            {
                e=path.S[path.top--];
                while(e.di==3&&path.top>-1)
                {
                    Undo(e.seat);
                    e=path.S[path.top--];
                }
                if(e.di<3)
                {
                    e.di++;
                    path.S[++path.top]=e;
                    curpos=NextPos(e.seat,e.di);
                }
            }//if
        }//else
    }while(path.top>-1);
    return FALSE;
}
//输出路径
void PrintPath(MazeType path)
{
    int i=0;
    while(i<=path.top)
    {
        printf("第%d步:(%d,%d)\n",path.S[i].ord,path.S[i].seat.row,path.S[i].seat.col);
        i++;
    }
}
//输出路径
void PrintPath2()
{
    for(int i=0;i<ROW_NUM;i++)
        for(int j=0;j<COL_NUM;j++)
        if(grid[i][j]==PATH)
            printf("(%d,%d)\n",i,j);
}
int main()
{
    MazeType path;
    PosType start={0,0},end={6,12};
    if(MazePath(path,start,end))
        PrintPath(path);
    else
        printf("not reachable!\n");

    PrintPath2();
}

Algorithm学习笔记 --- 迷宫问题相关推荐

  1. Shor’s Algorithm 学习笔记

    Shor'sAlgorithm 以下是我在学习Quantum Algorithm时整理的演示PPT,是我对这个算法的一些个人理解希望可以帮到你.

  2. Grover’s Algorithm 学习笔记

    Grover's Algorithm 以下是我在学习Quantum Algorithm时整理的演示PPT,是我对这个算法的一些个人理解希望可以帮到你.

  3. SLAM--VICP(Velocity Updating Iterative Closest Point Algorithm)学习笔记

    参考资料: <VICP: Velocity Updating Iterative Closest Point Algorithm>–Seungpyo Hong Heedong Ko Jin ...

  4. algorithm头文件下的常用函数-学习笔记

    algorithm头文件下的常用函数-学习笔记 max(x,y),min(x,y),abs(x) swap(x,y) reverse(it,it2) next_permutation() fill( ...

  5. 强化学习笔记:多臂老虎机问题(7)--Gradient Bandit Algorithm

    目录 0. 前言 1. 算法原理 2. Python仿真 2.1 函数改造 2.2 softmax() 2.3 改造后的k_armed_bandit_one_run() 2.4 对比仿真 2.5 一点 ...

  6. 深度强化学习之迷宫DQN(NIPS 2015版)实践笔记——入门提升篇

    1. 背景 在「强化学习」(RL)领域,早期大部分成功的算法都依赖于人工提取特征,并结合线性的值函数或策略表示,算法的表现很大程度上取决于特征提取的质量,隐匿于机器学习中.近年来,「深度学习」(DL) ...

  7. 【学习笔记】Multi-Objective Differential Evolution Algorithm --MODEA

    [学习笔记]Multi-Objective Differential Evolution Algorithm --MODEA 正文 (一)算法关键点 (二).概念定义 算法流程 算法伪代码.算法流程图 ...

  8. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  9. SVO中 Inverse Compositional Image Alignment方法的学习笔记

    SVO中 Inverse Compositional Image Alignment方法的学习笔记 这篇文章 光流法简介 逆向光流法 结尾 这篇文章  在SVO系统中的"Relaxation ...

最新文章

  1. 如何设计一门语言(九)——类型
  2. careercup-数组和字符串1.7
  3. debian源码编译安装mysql5.6_MySQL 5.6 Linux Debian/Ubuntu源码编译安装 LNMP之MySQL
  4. oracle 11g proc c,Solaris 10下 Oracle 11G proc 的C程序示例
  5. 二、saltstack基础配置
  6. POJ2513Colored Sticks
  7. Python图像旋转任意角度
  8. 台式计算机如何连接网络,台式机如何去连接网络
  9. poi-tl——Word模板生成器
  10. python爬app视频_用Python爬抖音APP短视频
  11. Linux之SAMBA服务——SMB协议
  12. vscode中backspace按键失效
  13. 服务器断电后可以自动开机吗,想要服务器断电后自动开机,怎么设置?
  14. 对比学习用于推荐系统问题(SSL,S^3-Rec,SGL,DHCN,SEMI,MMCLR)
  15. 车牌号合法性校验正则表达式(含新能源车牌)
  16. 苹果最新发布的16 英寸 MacBook Pro有哪些亮点和不足之处?
  17. 权限认证实现(责任链模式)
  18. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(一) 同步商品...
  19. win10 c语言 语音功能,win10系统自带录音功能在哪?windows10开启录音功能的方法-系统城...
  20. Java教程:如何对接自定义钉钉机器人并实现群聊消息发送

热门文章

  1. window下php5.6-x64-ts可用php_redis.dll文件
  2. Win7电脑,无法把文件保存到桌面上?
  3. 如何深入学习python_菜鸟如何学好python
  4. 博阅likebook alita专用pdf制作
  5. linux限制ping的时间,如何限制Linux命令程序运行的时间
  6. java continue goto_Java中goto和break、continue实现区别
  7. 两个相邻盒子的边框怎么只显示一个_【前端小课堂】0044 盒子
  8. 交际过程的两个基本环节_男女相处,若不介意这些“小动作”,基本可以确定“关系暧昧”...
  9. mysql杨辉三角_两个经典的小例子:杨辉三角和水仙花
  10. linux udp 端口 抓包,tcpdump之UDP抓包