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

c语言实现老鼠走迷宫

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

L3Byb3h5L2h0dHAvaW1hZ2UubWFtaWNvZGUuY29tL2luZm8vMjAyMDAzLzIwMjAwMzE4MTUzNjQxNDE2MjY2LnBuZw==.jpg

老鼠走迷宫是经典的递回求解的算法题

我们用二维数组表示迷宫场景。其中用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

{

for(j=0;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

{

for(j=0;j

{

if(maze[i][j] == 2) //当值为2时是墙壁

printf("?");

else if(maze[i][j] == 1) //当值为1时是路径

printf("??");

else

printf(" ");

}

printf("\n");

}

}

输出:

显示迷宫:

???????

? ?

? ? ? ?

? ? ??

?? ? ??

? ?

???????

显示路径:

???????

??? ?

???? ? ?

?????? ??

????? ??

? ?????????

???????

以上是老鼠走迷宫问题的单个解决方法,迷宫未必只有一条路可以走。那么求多条路会不会很麻烦呢?

当然不会,只要单一路径解决了,多条路解决方案无非就是在单一路径稍作修改,对可行路径进行遍历就可以了。

下面是全部代码:

#include

#include

#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

{

for(n=0;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

{

for(j=0;j

if(maze[i][j] == 2)

printf("?");

else

printf(" ");

printf("\n");

}

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

return 0;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值