1 #include <stdio.h> 2 #include <stdlib.h> 3 int visit(int, int); 4 5 int maze[7][7] = 6 7 { 8 {2, 2, 2, 2, 2, 2, 2}, 9 {2, 0, 0, 0, 0, 0, 2}, 10 {2, 0, 2, 0, 2, 0, 2}, 11 {2, 0, 0, 2, 0, 2, 2}, 12 {2, 2, 0, 2, 0, 2, 2}, 13 {2, 0, 0, 0, 0, 0, 2}, 14 {2, 2, 2, 2, 2, 2, 2} 15 }; 16 int startI = 1, startJ = 1; // 指定入口 17 int endI = 5, endJ = 5; // 指定出口 18 int success = 0;//用来标记 visit 函数的结果 19 20 int main(void) 21 { 22 int i, j; 23 printf("显示迷宫: "); 24 for(i = 0; i < 7; i++) 25 { 26 for(j = 0; j < 7; j++) 27 if(maze[i][j] == 2) 28 printf("*"); 29 else 30 printf(" "); 31 printf(" "); 32 } 33 if(visit(startI, startJ) == 0) 34 printf(" 没有找到出口! "); 35 else 36 { 37 printf(" 显示路径: "); 38 for(i = 0; i < 7; i++) 39 { 40 for(j = 0; j < 7; j++) 41 { 42 if(maze[i][j] == 2) 43 printf("*"); 44 else if(maze[i][j] == 1) 45 printf("#"); 46 else 47 printf(" "); 48 } 49 printf(" "); 50 } 51 } 52 return 0; 53 } 54 int visit(int i, int j) 55 { //递归算出老鼠该走的道路,上下方向判断 56 maze[i][j] = 1; 57 if(i == endI && j == endJ)//说明到达了指定的出发点 58 success = 1; 59 if(success != 1 && maze[i][j+1] == 0) visit(i, j+1); 60 if(success != 1 && maze[i+1][j] == 0) visit(i+1, j); 61 if(success != 1 && maze[i][j-1] == 0) visit(i, j-1); 62 if(success != 1 && maze[i-1][j] == 0) visit(i-1, j); 63 if(success != 1) 64 maze[i][j] = 0; 65 return success; 66 }
老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。
解法
老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,
无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止
