C语言老鼠走迷宫(单路径)算法详细讲解

2023-05-16

  最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了。琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙。所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题可以找到解决的方法,二来是为了记录一下自己的思路,以免以后记不住。俗话说得好,好记性不如烂笔头。

  那么废话不多说,进入正题。关于C语言老鼠走迷宫算法,网上有很多案例,CSDN上面也有很多。大家都是能找到的。基本上的思路都是利用数组模拟迷宫,利用函数的递归算法来实现的。

以下为老鼠走迷宫(单路径)的代码:

# include <stdio.h>
# include <Stdlib.h>
int vis(int,  int);

int maze[7][7] = {{2,  2,  2,  2, 2, 2, 2},//绘制一个7x7的迷宫
                  {2,  0,  0,  0, 0, 0, 2},
                  {2,  0,  2,  0, 2, 0, 2},
                  {2,  0,  0,  2, 0, 2, 2},
                  {2,  2,  0,  2, 0, 2, 2},
                  {2,  0,  0,  0, 0, 0, 2},
                  {2,  2,  2,  2, 2, 2, 2}};
int startI = 1, startJ = 1;//定义起点
int endI = 5, endJ = 5;//定义终点
int success = 0;//定义终点变量

int main (){
    int i, j;
    //显示迷宫
    printf("显示迷宫: \n");
    for(i = 0; i < 7; i++){
        for(j = 0; j < 7; j++){
            if(maze[i][j] == 2)//当数组内元素为2时就是墙
            printf("■ ");
            else printf("□ ");//否则就说明其余是路
        }
        printf("\n");
    }

    if(vis(startI, startJ) == 0)//调用走迷宫函数vis,寻找从起点到终点的路径,若无法到达此处输出
    printf("\n没有找到出口!!! \n");
    else {
        //输出解密后的路径

        printf("\n迷宫路径为:\n");
        for(i = 0; i < 7; i++){
            for(j = 0; j < 7; j++){
                if(maze[i][j] == 2)//同上,2代表墙
                printf("■ ");
                else if(maze[i][j] == 1)//在29行处调用vis函数后,就已经将迷宫的路径解答出来了.   1代表所走的路径及迷宫正确走法
                printf("  ");
                else printf("□ ");//否则就是不正确的路
            }
            printf("\n");
        }
    }
    
    return 0;
}

int vis(int i, int j){//迷宫解密函数
    maze[i][j] = 1;//将当前位置定义为1
    if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1
    if(success != 1 && maze[i][j+1] == 0) vis(i, j+1);//向右探索路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i+1][j] == 0) vis(i+1, j);//向下探寻路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i][j-1] == 0) vis(i, j-1);//向左探索路径,可以就执行,不行就执行下一条语句
    if(success != 1) maze[i][j] = 0;//判断是否到达终点,没有就将路径清零
    return success;
}

备注之类的我都写好了。如果你这是想实现一个过程,恭喜你已经完成了,这个代码,是一个7X7的迷宫,如果你有其他的要求那么将数组长度,数组元素以及循环的长度更改一下就行了。

----------------------------------------------------------------------------------------

接下来就是关于算法的详细讲解了,先贴一张算法的流程图:

只要对于C语言有所了解的就应该能够理解,主要就是三部分,初始化,判断,输出。

这里在判断语句中调用了解密函数。也可以单独调用一次解密函数,再判断是否有迷宫的解法。都是可以的。

这个老鼠走迷宫算法的关键就在于解密函数。以下将就解密函数的一部分进行讲解。其他的都是类似的推导方法,以此类推即可。

    maze[i][j] = 1;//将当前位置定义为1
    if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1
    if(success != 1 && maze[i][j+1] == 0) vis(i, j+1);//向右探索路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i+1][j] == 0) vis(i+1, j);//向下探寻路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i][j-1] == 0) vis(i, j-1);//向左探索路径,可以就执行,不行就执行下一条语句
    if(success != 1) maze[i][j] = 0;//判断是否到达终点,没有就将路径清零
    return success;

由解密函数可知,每次调用解密函数都是将当前的位置赋值为1(就相当于在此处留下了自己的脚印),然后依次判断是否到达终点,若到达终点就令终点变量为 1, 同时返回终点变量值,用于之前的判断; 是否能够向右走,是否能够向下走,是否能够向左走。当依次判断最终找到了终点,那么就会将终点变量返回回去。若之前的探索路径是错误的,就会将当前脚印清除,返回到之前的判断处,尝试其他路径是否能够到达终点,若还是无法到达终点。就再次清除脚印,再返回到之前的判断处尝试其他路径。此处的流程图只是画了一个2次内嵌套。当然代码实现的嵌套数由实际情况而视。

-----------------------------------------------------------------------------------------------------------

这是一个可视化的老鼠尝试各种路径的情况,可以更方便的让大家理解老鼠尝试路径,以及返回的现象。当然,你也可以将迷宫的路径进行更改。

# include <stdio.h>
# include <Stdlib.h>
int vis(int,  int);
void pin();

int maze[7][7] = {{2,  2,  2,  2, 2, 2, 2},//绘制一个7x7的迷宫
                  {2,  0,  0,  0, 0, 0, 2},
                  {2,  0,  2,  0, 2, 0, 2},
                  {2,  0,  0,  2, 0, 2, 2},
                  {2,  2,  0,  2, 0, 2, 2},
                  {2,  0,  0,  0, 0, 0, 2},
                  {2,  2,  2,  2, 2, 2, 2}};
int startI = 1, startJ = 1;//定义起点
int endI = 5, endJ = 5;//定义终点
int success = 0;//定义路径变量

int main (){
    int i, j;
    //显示迷宫
    pin();
    if(vis(startI, startJ) == 0)//调用走迷宫函数vis,寻找从起点到终点的路径,若无法到达此处输出
    printf("\n没有找到出口!!! \n");
    else   pin();
    return 0;
}

int vis(int i, int j){//迷宫解密函数
    maze[i][j] = 1;//将当前位置定义为1
    pin();
    if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1
    if(success != 1 && maze[i][j+1] == 0) vis(i, j+1);//向右探索路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i+1][j] == 0) vis(i+1, j);//向下探寻路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i][j-1] == 0) vis(i, j-1);//向左探索路径,可以就执行,不行就执行下一条语句
    if(success != 1 && maze[i-1][j] == 0) vis(i-1, j);//向上返回,
    if(success != 1) {maze[i][j] = 0; pin();}//判断是否到达终点,没有就将路径清零
    return success;
}
void pin(){
    printf("\n迷宫路径为:\n");
    int i, j;
        for(i = 0; i < 7; i++){
            for(j = 0; j < 7; j++){
                if(maze[i][j] == 2)
                printf("■ ");
                else if(maze[i][j] == 1)//在29行处调用vis函数后,就已经将迷宫的路径解答出来了,并将所走路径设置为1
                printf("→ ");
                else printf("□ ");
            }
            printf("\n");
        }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言老鼠走迷宫(单路径)算法详细讲解 的相关文章

  • 前后端分离项目的部署

    本次项目的项目架构图 xff1a Nginx主要部署的是 项目的静态资源 xff0c 即前端项目 通过Nginx的反向代理 xff0c 将请求发给Tomcat服务器 然后获取数据通过MySQL的主从复制 xff0c 主库负责更新数据 xff
  • echarts基本用法

    目录 tooltip 设置提示框信息 图表的提示框组件 legend 图例组件 toolbox 工具箱组件 可以另存为图片等功能 grid 网格配置 grid可以控制线型图 柱状图 图表大小 xAxs 设置x轴的相关配置 y轴同理 seri
  • java实现UDP通信传输信息

    实现UDP通信要依靠 DatagramPacket对象进行实现 UDP协议的相关介绍 xff1a UDP传输分为 服务端 和客户端 服务端发送消息 客户端接收消息 xff0c 服务端需要知晓客户端的 IP和所监听的端口号 话不多说直接上代码
  • MySQL篇之动态建表。

    在日常开发中 xff0c 可能会出现 动态配置的一些情况 xff0c 此时存储动态配置的一些数据时就需要动态建表了 xff0c 家人们可以选则两种方案 一种是采用mybatis的mapper xml文件里面使用 语句进行创建 二就是使用da
  • IDEA 2020.2 配置Tomcat服务器

    1 创建一个工程 2 右键项目名称 xff0c 选择 add framwork support 3 选中Web Application xff0c 默认勾选创建web xml 目录结构如下 4 点这两个地方中的任意一个 xff0c 添加配置
  • Java笔记之markdown语法

    狂神说Java系列视频笔记 本文章是作者学习B站系列视频 狂神说Java 的记录笔记与心得 xff0c 创作不易 xff0c 希望能够得到您的支持 1 Markdown的基本语法与使用 Markdown是当下一种较为流行的一种写作方法 通过
  • Java之数组专题

    文章目录 Java基础之数组专题数组的定义数组的声明与初始化数组元素的访问内存分析数组的使用For Each 循环数组作方法入参冒泡排序 多维数组稀疏数组 Java基础之数组专题 本文章是作者学习B站系列视频 狂神说Java 与经典书籍 J
  • Java封装详解

    Java类和对象 本文章是作者学习B站系列视频 狂神说Java 与经典书籍 Java核心技术 的记录笔记与心得 xff0c 创作不易 xff0c 希望能够得到您的支持 Java的构造器 Java的构造器 在用Java自定义类时 xff0c
  • C++ primer plus第七章习题中遇到的cin与cin.get问题

    cin gt gt 与cin get 是cpp程序常用到的输入函数 xff0c 近日在编写一道简单的习题时 xff0c 对二者产生了一些疑问 xff08 题目来源 C 43 43 primer plus 中文版习题第七章第六题 xff09
  • Leetcode部分经典链表题解析(涉及链表的反转、排序、合并、移除元素、成环、相交等操作)

    链表相关问题 第206题 反转链表 要求 xff1a 将给定链表进行反转操作 xff0c 第一个结点作为尾结点 xff0c 第二个结点指向第一个节点 xff0c 以此类推 xff0c 使得原链表的尾结点作为答案的头结点 思路一 xff1a
  • Linux报错:terminate called after throwing an instance of ‘std::regex_error‘ what(): regex_error

    文章目录 1 报错 xff1a 2 源码 3 原因 xff1a 4 解决办法 xff1a 5 运行成功 xff1a 1 报错 xff1a Linux中测试cpp httplib时出现报错std regex error xff0c 但源码中并
  • Redis学习笔记(狂神说)

    狂神视频地址 xff1a https www bilibili com video BV1S54y1R7SB Nosql概述 为什么要用Nosql 1 单机Mysql的年代 DAL xff1a 数据库访问层 在90年代 xff0c 一个基本
  • gazebo地图构建

    搭建地图环境是gazebo的基础功能 打开gazebo 可以在终端输入指令 打开的时候一定要有sudo xff0c 不然有可能在后面保存的时候出现画面卡住不动的情况 span class token operator span sudo g
  • Linux Ubuntu18.04安装微信

    最近做双系统 xff0c 在Ubuntu里下载微信时发现微信没有光网里没有开发Linux版本的微信 xff0c 找到了一些使用网页版登录微信的教程 xff0c 按着网上的教程做下来会的到一个如下的微信图标 打开扫描二维码后无法登录 可以在其
  • 虚拟机Ubuntu18.04 使用usb_cam调用笔记本摄像头

    虚拟机搭载Ubuntu18 04调用笔记本的摄像头 xff08 踩坑以及解决方法 xff09 一 建立工作空间 xff08 略 xff09 这里我建立的工作空间名称是catkin ones 二 下载usb cam包并进行编译 git clo
  • 关于UDP双向通信原理解释与范例

    注 本文不提供UDP通信的头文件 OK Let s do it 首先 我们需要了解什么叫做UDP xff0c 之前博主有些过TCP的通信范例 xff0c 我们可以了解到TCP的通信是一个稳定的 xff0c 可以进行双边通信的方式 同样附带上
  • windows10引导盘修复

    Windows修复引导项 前几天做双系统 xff0c 在使用Easybcd制作引导项时误删win10原本的引导项 xff0c 导致无法开机 xff0c 但是我可以通过磁盘直接启动linux 记录以下修复过程 在Linux里使用工具检查恢复
  • 局部路径规划:DWA算法

    一 概述 DWA算法是全称是Dynamic Window Approach 是在ROS中应用比较广泛的局部路径规划算法 主要作用是接受全局路径规划器生成的路径 xff0c 里程计信息 xff0c 地图信息等 xff0c 通过局部路径规划器将
  • ORB_SLAM2地图保存

    ORB SLAM2地图保存 在安装好orb slam2后按照教程中的方法做了地图构建的实验 xff0c 但是当地图达到想要的标准之后 xff0c 却发现没有办法保存地图 xff0c 查看ORB SLAM2源码发现在System h中有如下一
  • ros仿真小车

    ros仿真小车 补全前面博客中缺少的一些部分关于前面博客中的robotcar 本文也可单独食用 xff09 创建工作空间并初始化 span class token function mkdir span p catkin ws src sp

随机推荐

  • 【2023电赛备赛】msp430f5529学习笔记(一)

    写在前 本人目前是大二在读生 xff0c 第一次参加电赛 xff0c 准备不充分 xff0c 结果熬了四天 xff0c 最后成绩却不如人意 有51和32的基础 xff0c 然后想立一个flag系统的学习一下主打超低功耗的msp430f552
  • C语言经典题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    include lt stdio h gt 通过for循环将变量i j k的取值锁定在1 xff0c 2 xff0c 3 xff0c 4之间 int main int num 61 0 int i 61 0 j 61 0 k 61 0 fo
  • 单词逆序输出(c语言)

    int main int l j 61 0 int tmp 61 0 存储输入字符串的数组 char arr 100 61 34 i love beijing 34 用来存储输出字符串的数组 char arr2 100 输入字符串 gets
  • 进程虚拟地址空间

    关键词 xff1a 进程虚拟地址空间 xff0c 进程描述符 xff0c 页表 xff0c 分段式 xff0c 段页式 在进入正式的内容之前 xff0c 我们先了解一个重要的概念 进程描述符PCB 在Linux操作系统中 xff0c 描述进
  • 简单了解函数调用过程

    什么是栈帧 C C 43 43 程序的基本组成部分是函数 当程序在运行时 xff0c 每个函数每次调用都会在调用栈上维护一个独立的栈帧 xff0c 栈帧中维持着函数所需的各种信息 栈帧也叫过程活动记录 xff0c 是编译器用来实现过程 函数
  • 错题汇总1

    1 以下程序的运行结果是 xff08 xff09 int main void printf 34 s 5 3s n 34 34 computer 34 34 computer 34 return 0 A computer puter B c
  • 使用C/C++制作信息管理系统(demo)

    要求 xff1a 在windows环境下使用Vistual studio以C C 43 43 语言编译一个具有基础框架的客户信息管理系统 必须使用到封装 继承 map容器 SQL数据库技术 我 是 分 割 线 未经过UI处理的基础系统功能效
  • 错题汇总2

    1 下列程序的打印结果是 char p1 15 61 34 abcd 34 p2 61 34 ABCD 34 str 50 61 34 xyz 34 strcpy str 43 2 strcat p1 43 2 p2 43 1 printf
  • C++之继承初识(不包含虚拟继承)

    C 43 43 是一种面向对象的语言 xff0c 而面向对象 xff0c 有着三大特征 封装 xff0c 继承 xff0c 多态 关于封装 xff0c 在我的其它博客中已经有过简单的介绍了 这里我将简单叙述一下面向对象的三大特征之二 继承
  • C++之虚拟继承与继承的小总结

    本来是想将虚拟继承的部分写在上一篇的 xff0c 但是虚拟继承的分析实在有些复杂 xff0c 为了方便我自己回顾 xff0c 就干脆单写一篇吧 我们之前说过了 xff0c 虚拟继承可以解决菱形继承的二义性以及数据冗余的问题 xff0c 实际
  • C++之初识多态(Visual Studio 2019)

    此文章关于多态的代码全部是使用Visua Studio2019 x86 实现的 xff0c C 43 43 多态在不同编译器中的实现细节可能不同 xff0c 所以部分情况下相同代码运行结果可能不同 xff0c 在此声明 目录 多态的概念 多
  • C工程与寄存器封装(lv9-day13)

    文章目录 C工程与寄存器封装1 C语言工程简介2 启动文件3 C语言实现LED闪烁3 1 C语言与汇编分别是怎么操作寄存器的3 2 用C语言实现LED闪烁 4 寄存器的封装4 1 第一种封装方式 xff08 宏定义 xff09 4 2 第二
  • C++中auto的用法

    目录 1 auto初始化 1 1auto还可以与指针 xff0c 引用以及const进行组合 xff0c 但是在不同场景下会有相对应的推导规则 1 1 1指针和引用 1 1 2const 2 增强for循环 3 auto的限制 C 43 4
  • 自定义函数实现strcat函数功能

    strcat函数定义 字符串追加 连接函数 它的功能就是在一个字符串后面追加上另外一个字符串 char strcat char destination const char source 特点 xff08 与strcpy类似 xff09 x
  • STM32实现智能加湿

    开发前的准备需要如下的材料 xff1a 雾化模块1个 STM32F103开发板一个 风扇驱动模块1个 xff08 可用继电器代替 xff09 我们采用的继电器是低电平触发的所以我们在使用的时候只用给它一个低电平的信号就可以控制它了 USB转
  • Qt项目实战:愤怒的小鸟(联机版)

    前言 本文章会详细介绍难点的内容 xff0c 不附带全部源码 xff0c 会将关键代码进行展示 因为只有截图 xff0c 这里在每一个动作和界面都添加了音效与BGM 同时附加了CG展示 素材和音效全部放在下面了 xff0c 需要可自行提取
  • Ubuntu中安装openCV时Cmake问题解决

    1 执行Cmake的语句指令 sudo cmake D CMAKE BUILD TYPE 61 Release D CMAKE INSTALL PREFIX 61 usr local 2 当执行完上述指令后遇见以下问题解决策略 问题1 xf
  • 使用 RGB-D 相机(Astra)实现 YOLO v3 实时目标检测

    设备和环境 xff1a 奥比中光RGB D相机 xff08 Astra xff09 xff1b Ubuntu16 04 首先 xff0c 先将自己的RGB D相机的环境与依赖构建好 xff0c 然后进行以下步骤构建darknet ros 1
  • Arduion应用U8g2库实现字符滚动效果

    由于U8g2库中没有可以位移的函数 xff0c 所以简单编写了一个可以实现字符滚动的代码 主要是为了记录一下自己学习Arduion的过程 算是一个记事本吧 xff01 当然如果你对于这方面有所需求 xff0c 可以拿去使用 主要是利用显示器
  • C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法 xff0c 其中遇到了一点困难 xff0c 导致卡进度了 琢磨了很久 xff0c 在绘制流程图时 xff0c 突然灵感大开理解了 xff0c 老鼠走迷宫算法的奇妙 所以写了这个 xff0c 一来是方便以后右和