最近在学习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;//将当前位置定义为1if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1if(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;//将当前位置定义为1if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1if(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;//将当前位置定义为1pin();if(i == endI && j == endJ) success = 1;//若到达终点,令终点为1if(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函数后,就已经将迷宫的路径解答出来了,并将所走路径设置为1printf("→ ");else printf("□ ");}printf("\n");}
}

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

  1. C语言-老鼠走迷宫(深度寻路算法)

    老鼠走迷宫-c语言(基于深度优先的寻路算法) 这个是学校的课设,刚开始有点头疼,但是感觉越做越有意思了,于是就有如下代码,可能相较于大佬还有差距,但是这是我目前所能做的最优的程序了吧! 话不多说,说一 ...

  2. C语言 老鼠走迷宫详解6,算法: Mazing-老鼠走迷宫

    说明 老鼠走迷宫是递回求解的基本题型.我们在二维阵列中使用 2 表示迷宫墙壁,使用 1 来表示老鼠的行走路径,尝试以程式求由入口至出口的路径. 解法 老鼠可走上,下,左,右四个方向.入口一般在左上,出 ...

  3. c语言老鼠走迷宫课程设计,C语言算法之老鼠走迷宫

    1.Algorithm Gossip: 老鼠走迷官(一)说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法: ...

  4. c语言老鼠走迷宫原理,C语言算法(3) 老鼠走迷宫

    1.Algorithm Gossip: 老鼠走迷官(一)说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法: ...

  5. c语言 老鼠乘法,c语言-老鼠走迷宫逐步理解

    c语言实现老鼠走迷宫 在没有智能手机的时代,不少人玩游戏会玩老鼠走迷宫这样的闯关游戏.每一关有着不同的地图场景,可能还会充斥着各种障碍. 老鼠走迷宫是经典的递回求解的算法题 我们用二维数组表示迷宫场景 ...

  6. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  7. c语言老鼠迷宫程序,C语言经典算法——老鼠走迷宫(二)

    说明 ​由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢? ​解法 ​求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退回上一格重新选择下一个位置 ...

  8. 算法:老鼠走迷宫问题

    算法:老鼠走迷宫问题(初) [写在前面] 老鼠走迷宫问题的递归实现,是对递归思想的一种应用. [问题描述] 给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图.给定入口位置和出 ...

  9. C语言实现老鼠走迷宫(附源码)

    CSDN源码下载:C语言实现老鼠走迷宫.zip 1.需求分析   利用二维数组创建一个随机迷宫或者自定义迷宫,再在迷宫中找到一条从起点到终点的路径,并用图形界面显示. 2.概要设计 3.详细设计 输入 ...

最新文章

  1. 李宏毅线性代数笔记8 :坐标系变换8
  2. 智能判断图片中是否存在某物体_智能家居组件漫谈——人体传感器
  3. java 命令行eclipse_在命令行中运行eclipse中创建的java项目
  4. java高级类_Java高级类特性(一)
  5. 数字地和模拟地都是地,为什么要分开?
  6. 作业2.1.1 安装并使用CheckStyle
  7. Scale-Adaptive Neural Dense Features: Learning via Hierarchical Context Aggregation
  8. [USACO13JAN] Seating
  9. (原創) C++的4個Class Access Label (C/C++)
  10. MyBatis generator 注解方式和xml方式
  11. 金立android手机怎么截图,金立M6手机怎么截图 金立M6截屏/截图方法(两种)
  12. 嵌入式软件可靠性设计
  13. ip地址和域名的关系是什么?
  14. python通过串口发送bin文件
  15. 用evo工具箱评估LeGO-LOAM轨迹
  16. matlab 小波 清浊音,matlab语音信号处理如何判别清浊音?
  17. python进行邮件发送以及django中利用邮件注册激活功能
  18. gitlab 配置QQ邮箱
  19. 在wordpress中插入b站视频的代码
  20. Python中堪称神仙的六个内置函数

热门文章

  1. iPhone续航真的很差吗?这样设置你的苹果手机,可增加约30%的续航时长
  2. python学习之路:合并多个excel文件、合并多个pdf文件
  3. 因为相信所以看见,既然看见注定坚信《16》
  4. 搭配Online:特朗普:俄罗斯及沙特将大幅减产,沙特、俄罗斯:你在无中生有
  5. Fsm serialdp
  6. Java中condition的用法_java condition 使用
  7. 基于PHP的支付宝H5、APP支付
  8. springMybatis整合
  9. java多线程与动态代理
  10. 眼图观测实验报告_眼图实验报告.docx