从算法学起C语言--老鼠走迷宫
来源:互联网 发布:java api 连接hdfs 编辑:程序博客网 时间:2024/05/16 05:59
转载请注明出处,谢谢~
背景说明:
老鼠走迷宫是递回求解的基本问题,我们在二维阵列中用2表示迷宫墙壁,使用1来表示老鼠走过的路径,求出由入口到出口的路径。
大天朝白话文:
有迷宫挡在了你和妹子/帅哥中间,自己看着办吧。
首先打印个小迷宫看看:
全封闭?No!我们去掉最右边和最底下的一行,只要这个7*7方阵,外边包起来主要是看路径的时候比较清晰。
把左上角的第一个非墙壁点作为起点,即二维数组的(1,1)元素作为起点,赋值为0,整个数组可以定义为:
int maze[9][9] = {{2,2,2,2,2,2,2,2,2},{2,0,0,0,0,0,0,0,2},{2,0,2,2,0,2,2,0,2},{2,0,2,0,0,2,0,0,2},{2,0,2,0,2,0,2,0,2},{2,0,0,0,0,0,2,0,2},{2,2,0,2,2,0,2,2,2},{2,0,0,0,0,0,0,0,2},{2,2,2,2,2,2,2,2,2}};然后我们脑补画面,一个小老鼠往下走,他有四个方向可以选择,上下左右,右边和下边是空的,可以移动,移动后又有四个方向可以选择,做判断,如果不是墙壁2,则可以移动,以此类推,知道移动到终点(7,7)的位置,打印路径即可,移动过的地方我们赋值为1,直到走到终点,然后递回的过程把上一个多选位置(即至少有两个方向可走)到下一个多选位置的元素全部置回0.下面就是代码实现:
void visit(int i,int j){int m,n;maze[i][j] = 1;if (i == endI && j == endJ){printf("\n显示路径: \n");for (m = 0 ; m < 9 ; m++){for (n = 0 ; n<9 ; n++){if(maze[m][n] == 2){printf("█");}else if(maze[m][n] == 1)printf("◇");elseprintf(" ");}printf("\n");}}if(maze[i][j+1] == 0) visit(i, j+1);if(maze[i+1][j] == 0) visit(i+1, j);if(maze[i][j-1] == 0) visit(i, j-1);if(maze[i-1][j] == 0) visit(i-1, j);maze[i][j] = 0;}
这段代码最后的maze[i][j] = 0就是将多选路径中的元素置为0的语句。这样打印的结果是这样的:
附上完整代码:
#include <stdio.h>#include <stdlib.h>void visit(int ,int);int maze[9][9] = {{2,2,2,2,2,2,2,2,2},{2,0,0,0,0,0,0,0,2},{2,0,2,2,0,2,2,0,2},{2,0,2,0,0,2,0,0,2},{2,0,2,0,2,0,2,0,2},{2,0,0,0,0,0,2,0,2},{2,2,0,2,2,0,2,2,2},{2,0,0,0,0,0,0,0,2},{2,2,2,2,2,2,2,2,2}};int startI = 1,startJ = 1;int endI = 7,endJ = 7;int main(void){int i,j;printf("显示迷宫 :\n");for (i = 0 ; i < 9 ; i++){for (j = 0 ; j < 9 ; j++){if(maze[i][j] == 2){printf("▉");}else{printf(" ");}}printf("\n");}visit(startI,startJ);system("pause");return 0;}void visit(int i,int j){int m,n;maze[i][j] = 1;if (i == endI && j == endJ){printf("\n显示路径: \n");for (m = 0 ; m < 9 ; m++){for (n = 0 ; n<9 ; n++){if(maze[m][n] == 2){printf("█");}else if(maze[m][n] == 1)printf("◇");elseprintf(" ");}printf("\n");}}if(maze[i][j+1] == 0) visit(i, j+1);if(maze[i+1][j] == 0) visit(i+1, j);if(maze[i][j-1] == 0) visit(i, j-1);if(maze[i-1][j] == 0) visit(i-1, j);maze[i][j] = 0;}
但是有些时候我们不希望打印所有的路径,而只希望打印一条路径即可,那么我们修改下代码:
int visit2(int i, int j) {maze[i][j] = 1;if(i == endI && j == endJ)success = 1;if(success != 1 && maze[i][j+1] == 0) visit(i, j+1);if(success != 1 && maze[i+1][j] == 0) visit(i+1, j);if(success != 1 && maze[i][j-1] == 0) visit(i, j-1);if(success != 1 && maze[i-1][j] == 0) visit(i-1, j);if(success != 1)maze[i][j] = 0;return success;}visit2的作用就成了找到一条可用路径即可。下面附上main的代码:
int main(void) {int i, j;printf("\n");for(i = 0; i < 7; i++) {for(j = 0; j < 7; j++)if(maze[i][j] == 2)printf("█");elseprintf(" ");printf("\n");}if(visit2(startI, startJ) == 0)printf("");else {printf("\ng\n");for(i = 0; i < 7; i++) {for(j = 0; j < 7; j++) {if(maze[i][j] == 2)printf("█");else if(maze[i][j] == 1)printf(" ");elseprintf(" ");}printf("\n");}}return 0;}
ok!
0 0
- 从算法学起C语言--老鼠走迷宫
- C语言算法之老鼠走迷宫
- 递归算法求老鼠走迷宫(C语言)
- 老鼠走迷宫算法
- 老鼠走迷宫递归算法
- 老鼠走迷宫(c/python)
- 从算法学起C语言--河内之塔
- 从算法学起C语言--费氏数列
- 从算法学起C语言--杨辉三角
- 从算法学起C语言--三色旗问题
- 从算法学起C语言--八枚硬币
- 老鼠走迷宫算法中的一点优化
- 【算法】老鼠走迷宫问题的解答
- 每日一算法:老鼠走迷宫(一)
- 算法思考--------老鼠走迷宫(一)
- 算法思考--------老鼠走迷宫(二)
- 电子老鼠走迷宫-搜索算法
- [C++] 老鼠走迷宫(使用递回)
- Objective-c 中的Category和Extension
- EditingSupport 对TreeViewer和TableViewer的编辑功能的支持
- 几种不同语言版本的HMM实现
- apache2.4 AH01630: client denied by server configuration错误
- poj2187--Beauty Contest(凸包首杀)
- 从算法学起C语言--老鼠走迷宫
- 生成独立的gcc调试文件
- Hibernate ehcache 配置二级缓存及说明
- android context 上下文
- CODEVS 1475 m进制转十进制
- Android编译系统分析大全 终极总结篇
- 用js获取网页DOM(例:input标签的ID)的chrome插件
- undefined reference to symbol 'floor@@GLIBC_2.0'
- 如何测试io口?