c语言-老鼠走迷宫逐步理解

c语言实现老鼠走迷宫

在没有智能手机的时代,不少人玩游戏会玩老鼠走迷宫这样的闯关游戏。每一关有着不同的地图场景,可能还会充斥着各种障碍。

  • 老鼠走迷宫是经典的递回求解的算法题
    我们用二维数组表示迷宫场景。其中用2代表迷宫的墙壁,0代表可行通道。
    我们用7*7的二维数组具体实现,假定我们设置[1][1]是迷宫入口,[5][5]是迷宫出口。
#define M 7

int maze[M][M] =
{
        {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 start1=1,start2=1;
int end1=5,end2=5;

int main ()
{
        int i,j;

        printf("显示迷宫:\n");
        for(i=0;i<M;i++)                //对摆放的数组迷宫进行打印
        {
                for(j=0;j<M;j++)
                        if(maze[i][j] == 2)
                                printf("?");
                        else
                                printf("  ");
                printf("\n");
        }
}

这样我们的迷宫绘制基本完成。下面我们对老鼠可能行走的路径进行分析输出。
我们定义一个visit函数,对老鼠行走方向进行逻辑分析。我们把老鼠走的路径记作1,也就是数组中的0被改为1 。

int success = 0;   //声明全局变量,若到达出口,将被赋值为1

int visit(int i,int j)
{
        maze[i][j] = 1;         //传过来的位置一定是老鼠所行路径,赋值为1

        if(i==end1 && j==end2)  //判断是否到达[5][5]出口位置
                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);
//判断是否到达出口,没有则证明前面走的路径并不能到达出口,那么返回,把走过的位置重新写作0
        if(success != 1)
                maze[i][j] = 0;

        return success;
}

我们写好老鼠的行走路径后,在主函数中调用,并且输出。
以下代码写在主函数中

 if(visit(start1,start2) == 0)           //调用visit函数,判断老鼠是否走出迷宫
                printf("\n没有找到出口!\n");
        else{
                printf("\n显示路径:\n");
                for(i=0;i<M;i++)
                {
                        for(j=0;j<M;j++)
                        {
                                if(maze[i][j] == 2)             //当值为2时是墙壁
                                        printf("?");
                                else if(maze[i][j] == 1)        //当值为1时是路径
                                        printf("??");
                                else
                                        printf("  ");
                        }
                        printf("\n");
                }
        }

输出:

显示迷宫:
???????
?          ?
?  ?  ?  ?
?    ?  ??
??  ?  ??
?          ?
???????

显示路径:
???????
???        ?
????  ?  ?
??????  ??
?????  ??
?  ?????????
???????

以上是老鼠走迷宫问题的单个解决方法,迷宫未必只有一条路可以走。那么求多条路会不会很麻烦呢?
当然不会,只要单一路径解决了,多条路解决方案无非就是在单一路径稍作修改,对可行路径进行遍历就可以了。
下面是全部代码:

#include <stdio.h>
#include <stdlib.h>

#define M 9
//把迷宫加大成9*9格局
int maze[M][M] =
{
        {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 start1=1,start2=1;          //假定[1][1]是入口
int end1=7,end2=7;              //假定[7][7]是出口

void visit(int i,int j)
{
        int m,n;

maze[i][j] = 1;

        if(i==end1 && j==end2)  //判断是否到达[5][5]出口位置,到达直接输出
        {
                printf("\n显示路径:\n");
                for(m=0;m<M;m++)
                {
                        for(n=0;n<M;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);
//若代码运行到这一步,则证明前面走的路径并不能到达出口,则返回,把走过的位置重新写作0
                maze[i][j] = 0;
}

int main ()
{
        int i,j;

        printf("显示迷宫:\n");
        for(i=0;i<M;i++)                //对摆放的数组迷宫进行打印
        {
                for(j=0;j<M;j++)
                        if(maze[i][j] == 2)
                                printf("?");
                        else
                                printf("  ");
                printf("\n");
        }

        visit(start1,start2);        //直接调用visit函数,把输出内容放在visit函数中,好让所有路径进行遍历

        return 0;
}

老鼠走迷宫的算法是不是挺有意思呢?有能力的话还可以把老鼠走迷宫扩展成一个可以控制方向小游戏。

原文地址:https://www.cnblogs.com/tansss/p/12517473.html

时间: 2024-10-06 11:25:40

c语言-老鼠走迷宫逐步理解的相关文章

老鼠走迷宫(1)输出唯一路径(C语言)

需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁,用0表示通路. 老鼠每走到一个格子的时候就将该位置的值置为1,表示老鼠的行走路径包括这个格子. STEP 2 编程思路 ⑴这个题目可以用递归方法,只需要最后一步走到迷宫出口所在的格子. ⑵每一步测试上.下.左.右四个方向,选择一个方向前进. STEP 3 要点整理 ⑴走过的格子需要标记,否则无法输出

老鼠走迷宫(2)输出所有路径(C语言)

需求 有一个迷宫,在迷宫的某个出口放着一块奶酪.将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪.请找出它的行走路径. STEP 1 题目转化 我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁,用0表示通路. 老鼠每走到一个格子的时候就将该位置的值置为1,表示老鼠的行走路径包括这个格子. STEP 2 编程思路 ⑴这个题目可以用递归方法,只需要最后一步走到迷宫出口所在的格子. ⑵每一步测试上.下.左.右四个方向,选择一个方向前进. STEP 3 要点整理 ⑴输出所有路径的算法与输出单条路径

C语言算法之老鼠走迷宫

1.Algorithm Gossip: 老鼠走迷官(一) 说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法:老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选一个方向前进,无法前 进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是 递回的基本题. 代码: #include<stdio.h> #include<stdlib.h> int migo[7][

【老鼠走迷宫一】

/* 老鼠走迷宫一 说明: 老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1表示老鼠行走的路径,试以程 式求出由入口至出口的路径. 解法: 老鼠的走法有上,下,左,右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前 进方向,如此在阵列中依序测试四个方向,知道走到出口为至,这是返回的基本题,请直接看程式应就可以理解 */ #include <stdio.h> #include <stdlib.h> int visit(int , in

【老鼠走迷宫二】

/* 老鼠走迷宫二 有问题 */ #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表示通路,由此数组可展示为一个迷宫图.给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路. [代码] 对题目的描述部分 int migo[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, 0, 0, 2, 2},

老鼠走迷宫

1 /*说明:老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用 2 表示迷宫墙 2 壁,使用 1 来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 3 解法:老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选一个方向前进, 4 无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到 5 出口为止,这是递回的基本题. 6 */ 7 //在数组的初始化中可以画你的地图 8 #include<stdio.h> 9 #include<stdlib.h>

老鼠走迷宫全部路径

以下程序打印出老鼠走迷宫全部的路径: #include<stdio.h> #define LEN 9 int maze[9][9] = { {2, 0, 2, 2, 2, 0, 2, 2, 2}, {2, 0, 2, 2, 2, 0, 0, 2, 2}, {2, 0, 0, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 2, 0, 2, 2, 0, 2}, {2, 0, 0, 2, 0, 2, 2, 0, 2}, {2, 0, 0, 2, 0, 2, 2, 0, 2}, {2, 0

C语言动态走迷宫

曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: 1 //头文件 2 #include<stdio.h> 3 #include<windows.h>//Sleep(500)函数调用此头文件 4 #include<conio.h>//getch()函数调用此头文件 5 #include<stdlib.h>//system("cls")函数调用此头文件 6 7 //函数状态码定义 8 /*********************