老鼠走迷宫I
- 老鼠走迷宫I 推荐度:
- 相关推荐
老鼠走迷宫I
说明:老鼠走迷宫是递回求解的基本提醒,我们在二维阵列中使用2来表示迷宫墙壁,使用1来表示老鼠走过的行走路径,试以程序球场胡入口至出口的路径。
解法:老鼠的走法有上、下、左、右四个方向在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递回的基本题,请直接看程序应就可以理解。
/**内容;老鼠走迷宫I *时间;2/16/2013 */#include <stdio.h>// 注:二维数组,根据编译器采取的策略不同,起点或终点位置会有所不同
// 既编译器可能采取“按行优先”或者是“按列优先”这两种不同的策略 //终点位置
#define END_I 7
#define END_J 1 //迷宫为全局变量
//初始化迷宫,用2来表示墙壁、1表示路径
int g_maze[9][9] = { {2, 2, 2, 2, 2, 2, 2, 2, 2},{2, 0, 0, 2, 0, 2, 0, 0, 2},//起点位置(1,1) {2, 0, 2, 0, 0, 0, 0, 2, 2},{2, 0, 0, 0, 2, 2, 0, 0, 2},{2, 2, 2, 0, 0, 0, 2, 0, 2},{2, 0, 0, 0, 2, 0, 2, 0, 2},{2, 2, 2, 2, 0, 2, 0, 0, 2},{2, 0, 0, 0, 0, 0, 0, 2, 2},//终点位置(7, 1) {2, 2, 2, 2, 2, 2, 2, 2, 2},};bool g_sucess = false;//全局变量,用来确保是否到达终点。//打印迷宫
void printMaze(int *maze, int mazeWidth, int mazeHeight)
{int mazeSize = 0;//将传进来二位数组的长度相乘确保能够完全遍历完数组 mazeSize = mazeWidth * mazeHeight;for (int i = 0; i < mazeSize; ++i){if ( (i%mazeWidth) == 0){printf ("\n");}if ( *maze == 2 )//2表示墙壁,墙壁用X表示 {printf ("X");}else if ( *maze == 1 )//1表示走过的路径,用“.”表示 {printf ("."); }else if ( *maze == 3 )//终点位置打印笑脸 {putchar(1);}else//0表示可走路径,用“o”来表示 {printf ("o");}maze++;}printf ("\n\n");
} bool visit(int i, int j)
{g_maze[i][j] = 1;if ( (i==END_I) && (j==END_J) ){g_maze[i][j] = 3;g_sucess = true;return g_sucess;}else{//向下走 if ( (!g_sucess) && (g_maze[i][j+1]==0) ){visit(i, j+1);}//向右走 if ( (!g_sucess) && (g_maze[i+1][j]==0) ){visit(i+1, j);}//向上走 if ( (!g_sucess) && (g_maze[i][j-1]==0) ){visit(i, j-1);}//向左走 if ( (!g_sucess) && (g_maze[i-1][j]==0) ){visit(i-1, j);}if (!g_sucess)//如果还没有找到出口则说明该路线是死路,恢复该点原状 {g_maze[i][j] = 0;}return g_sucess;}
}int main()
{printf ("\t显示迷宫:\n\n");printMaze(&(g_maze[0][0]), 9, 9);if ( visit(1,1) )//把起点位置传进去 {printf ("已找到出口,打印路径:\n\n");printMaze(&(g_maze[0][0]), 9, 9);}else{printf ("没有找到出口!");}return 1;
}