老鼠走迷宫
来源:互联网 发布:2016美国对外贸易数据 编辑:程序博客网 时间:2024/05/20 11:49
老鼠走迷官(一)
说明:老鼠走迷宫是递归求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表
示老鼠的行走路径,求出由入口至出口的路径。
解法:老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前
进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是
递归的基本题。
#include <stdio.h>#include <stdlib.h> int visit(int, int); 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, 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(void) { int i, j; printf("显示迷宫:\n"); for(i = 0; i < 7; i++) { for(j = 0; j < 7; j++) if(maze[i][j] == 2) printf("█"); else printf(" "); printf("\n"); } if(visit(startI, startJ) == 0) printf("\n没有找到出口!\n"); else { printf("\n显示路径:\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("◇"); else printf(" "); } printf("\n"); } } return 0; } int visit(int i, int j) { //该点走过,标记为1 maze[i][j] = 1; //走到终点,成功 if(i == endI && j == endJ) success = 1; //向四个方向递归调用函数visit() 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); ////该点走过,但没成功,则该点重新置为0 if(success != 1) maze[i][j] = 0; return success; }
老鼠走迷官(二)
说明:由于迷宫的设计,老鼠走迷宫的入口至出口路径可能不只一条,如何求出所有的路径呢?
解法求所有路径看起来复杂但其实更简单,只要在老鼠走至出口时显示经过的路径,然后退
回上一格重新选择下一个位置继续递回就可以了,比求出单一路径还简单,我们的程式只要作
一点修改就可以了。
/*求所有路径*/#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); 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("◇"); else printf(" "); 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;}
0 0
- 老鼠走迷宫
- 老鼠走迷宫
- 老鼠走迷宫
- 老鼠走迷宫【2】
- 老鼠走迷宫【1】
- 老鼠走迷宫问题
- 老鼠走迷宫算法
- 老鼠走迷宫I
- 老鼠走迷宫II
- 老鼠走迷宫
- 老鼠走迷宫二
- 老鼠走迷宫
- 老鼠走迷宫解析
- 老鼠走迷宫问题
- 老鼠走迷宫
- 老鼠走迷宫
- 电子老鼠走迷宫
- 老鼠走迷宫
- POJ 3984 迷宫问题
- 做硬件的感想
- 问题二十三:C++中debug简单的运行死机问题
- 算法竞赛入门经典第二章
- 博为峰Java技术文章 ——JavaSE Swing GridLayout布局管理器I
- 老鼠走迷宫
- redis安装
- python 批量改名
- 简单的云计算术语【1】
- mysql数据处理
- codeforces 173E 组队 线段树+离线
- 分布式版本管理系统Git的基本介绍与使用
- opencv之clahe限制对比对自适应均衡之后检测车辆
- 你真的能搞定二分查找吗 — 二分查找及变形