老鼠走迷宫

来源:互联网 发布: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
原创粉丝点击