说明

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

解法

老鼠可走上,下,左,右四个方向.入口一般在左上,出口在右下(如果说有其他出入口情况则下述老鼠每步默认选择方向的顺序改变)

老鼠从入口出发,每走一步进行一次四个方向的选择,判断下步是否有可走方向(由于入口在左上,出口在左下,则优先选择右,下方向,之后选择左,上方向).无法前进时退回上步选择下一个可前进方向.

如此在阵列中按照顺序测试四个方向,直到走出出口为止.

代码(c语言版,思路可参考)

参数声明

int maze[7][7] = { {2,2,2,2,2,2,2},

{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,0},

{2,0,0,0,0,0,2},

{2,2,2,2,2,2,2} };//mazing map

int(*mazeP)[7];

mazeP = maze;//将二维数组传递给数组指针(数组指针是指针指向一个数组)

int startI = 1, startJ = 1, endI = 5, endJ = 5;//entrance and exit

int success = 0;//success mark

int i = 1,j = 1;//initialization of import and export

复制代码递回方法

//递回进行老鼠每步选择的方向,返回是否成功

int mazing_visit(int i, int j,int(*mazeP)[7],int success)

{

mazeP[i][j] = 1;

if (i == 5 && j == 5)success = 1;

//优先右下,然后左上

if ( 1 != success && mazeP[i][j + 1] == 0)mazing_visit(i, j + 1, mazeP, success);

if (success != 1 && mazeP[i + 1][j] == 0)mazing_visit(i + 1, j, mazeP, success);

if (success != 1 && mazeP[i][j - 1] == 0)mazing_visit(i, j - 1, mazeP, success);

if (success != 1 && mazeP[i - 1][j] == 0)mazing_visit(i - 1, j, mazeP, success);

if (success != 1)mazeP[i][j] == 0;

return success;

}

复制代码完整代码

#include

#include

#include

//Mazing-老鼠走迷宫

int mazing_visit(int, int,int (*p)[7],int);

void mazing()

{

int maze[7][7] = { {2,2,2,2,2,2,2},

{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,0},

{2,0,0,0,0,0,2},

{2,2,2,2,2,2,2} };//mazing map

int(*mazeP)[7];

mazeP = maze;//将二维数组传递给数组指针(数组指针是指针指向一个数组)

int startI = 1, startJ = 1, endI = 5, endJ = 5;//entrance and exit

int success = 0;//success mark

int i = 1,j = 1;//initialization of import and export

printf("显示迷宫: \n");

for (i = 0; i < 7; i++)

{

for (j = 0; j < 7; j++)

{

if (mazeP[i][j] == 2)//判断是否是墙壁

{

printf("*");

}

else

{

printf(" ");

}

}

printf("\n");

}

//判断是否存在出口,若有出口则打印出路径

if (mazing_visit(startI, startJ, mazeP,success) == 0)

{

printf("\n没有找到出口\n");

}

else

{

printf("\n显示路径:");

for (i = 0; i < 7; i++)

{

for (j = 0; j < 7; j++)

{

if (mazeP[i][j] == 2)

{

printf("*");

}

else if (mazeP[i][j] == 1)

{

printf(">");

}

else

{

printf(" ");

}

}

printf("\n");

}

}

}

int mazing_visit(int i, int j,int(*mazeP)[7],int success)

{

mazeP[i][j] = 1;

if (i == 5 && j == 5)success = 1;

//优先右下,然后左上

if ( 1 != success && mazeP[i][j + 1] == 0)mazing_visit(i, j + 1, mazeP, success);

if (success != 1 && mazeP[i + 1][j] == 0)mazing_visit(i + 1, j, mazeP, success);

if (success != 1 && mazeP[i][j - 1] == 0)mazing_visit(i, j - 1, mazeP, success);

if (success != 1 && mazeP[i - 1][j] == 0)mazing_visit(i - 1, j, mazeP, success);

if (success != 1)mazeP[i][j] == 0;

return success;

}

int main(void)

{

mazing();

return 0;

}

复制代码

C语言 老鼠走迷宫详解6,算法: Mazing-老鼠走迷宫相关推荐

  1. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  2. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  3. C语言解决约瑟夫问题详解的代码

    C语言解决约瑟夫问题详解的代码 参考文章: (1)C语言解决约瑟夫问题详解的代码 (2)https://www.cnblogs.com/odsxe/p/10791049.html (3)https:/ ...

  4. c语言中快排函数,c语言快排函数详解

    c语言快排函数详解 int cmp(const void *a, const void *b) 返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 ...

  5. 用html js制作迷宫,JavaScript生成随机迷宫详解

    本篇教程介绍了JavaScript生成随机迷宫详解,希望阅读本篇文章以后大家有所收获,帮助大家对JavaScript的理解更加深入. < #先看生成随机迷宫的代码吧↓ 1 2 3 生成随机迷宫v ...

  6. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  7. C语言:JSON格式详解

    C语言:JSON格式详解 C语言:cJSON库用法详解 C语言:使用cJSON库构造JSON C语言:使用cJSON库解析JSON字符串 JSON 简介 JSON全称 JavaScript Objec ...

  8. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  9. java文档注释定界符_c语言的注释定界符详解

    c语言的注释定界符详解 c语言的注释定界符是什么 1.最早期的C语言注释是:/* */ 2.后来又增加的行注释:// 其中/**/是多行注释,//是单行注释. 需要注意的是:C 语言的注释并不是可以出 ...

最新文章

  1. eclipse中搭建ssm框架
  2. $(document).ready(); $().ready(); $()
  3. ThinkPHP中,字段更新加1的几种写法
  4. win11菜单怎么添加快捷方式 Windows11开始菜单添加快捷方式的设置方法
  5. 1、反转一个3位整数
  6. 如何把PDF锁定,限制修改文档内容?
  7. echarts 生成 迁徙图_利用百度Echarts开发人口迁徙图(产品流向图)
  8. 产品读书《重新定义团队:谷歌如何工作》
  9. BUUCTF学习笔记-Easy_Clac
  10. 混合游戏环境:让人类一直身处在物联网中(作业 全靠google)
  11. [Hulu] 数组最大价值
  12. 三七女生节,解密阿里女程序员们的代码诗!
  13. 天梯赛座位 分配分数 20作者 陈越单位 浙江大学
  14. java裁剪图片_Java实现图片的裁剪
  15. wordpress 通过get_the_excerpt和the_excerpt函数获取文章摘要
  16. 为FishBot模型注入物理属性并在Gazebo中显示
  17. 32java访问(http):国家气象局 免费接口
  18. 基于51单片机的智能雨刷设计
  19. 如何正确选择ESD二极管,参考这几点!
  20. 分式相乘转换成分式加减的一般性方法的简单讨论

热门文章

  1. 视频画质如何提高?视频画质主要由哪些因素决定?
  2. Git远程同步本地代码
  3. C#窗体设计button中的Enable和visible的区别
  4. 用Direct3D设计二维横版过关动作类游戏的角色运动(双倍速、二段跳)
  5. Java多线程实现简单抢红包
  6. 网络二层技术——VLAN三种接口Access、Trunk、Hybrid(从原理到配置一篇带你搞懂)
  7. 入手分析rtx3070和rtx2080ti哪个强?rtx3070和rtx2080ti性能对比
  8. android 微信朋友圈 全功能,Android自定义TextView仿微信朋友圈文字展开全文功能
  9. java中split时,需要转义的几个字符
  10. C++ 对vector 排序