C语言之算法初步(电子老鼠闯迷宫递归算法)

  发现递归算法真的是个神奇的东西,还会自己在栈中记录下以前的数据,可以按照以前的记录返回到起始点,这个电子老鼠走迷宫是个很好的例子。研究了一个下午,总算还是有点收获的,突然对扫雷这个游戏有点感悟了。其实都是相同的道理。

电子老鼠闯迷宫代码如下:

代码
#include<stdio.h>
int flag=0; //flag用来标记是否路径全部走完
int a[12][12]={{1,1,1,1,1,1,1,1,1,1,1,1}, // 初始化迷宫
{1,0,0,0,0,0,0,0,0,0,0,1},
{
1,0,1,1,1,1,1,1,1,1,1,1},
{
1,0,1,0,0,0,1,0,0,0,1,1},
{
1,0,1,0,1,0,1,0,1,0,1,1},
{
1,0,1,0,1,0,1,0,1,0,0,1},
{
1,0,1,0,1,0,1,0,1,0,0,1},
{
1,0,1,0,1,0,1,0,1,1,0,1},
{
1,0,1,0,1,0,1,0,1,1,0,1},
{
1,0,1,0,1,0,1,0,1,1,0,1},
{
1,0,0,0,1,0,0,0,1,1,0,1},
{
1,1,1,1,1,1,1,1,1,1,1,1}};

int go(int x,int y)
{
a[x][y]
=2;
if((x==10&&y==10)) //迷宫出口设置为10,10
flag=1;
if(flag!=1&&a[x-1][y]==0) //判断向上是否有路
go(x-1,y); //这个go()纠结了好久,多了个return怎么都不行了
if(flag!=1&&a[x][y+1]==0) //判断向右是否有路
go(x,y+1);
if(flag!=1&&a[x+1][y]==0) //判断向下是否有路
go(x+1,y);
if(flag!=1&&a[x][y-1]==0) //判断向左是否有路
go(x,y-1);
if(flag!=1)
a[x][y]
=0;
return flag;
}

main()
{
int i,j,k,l,q;
for(i=0;i<12;i++) //输出迷宫
{
for(j=0;j<12;j++)
{
if(a[i][j]==0)
printf(
"");
if(a[i][j]==1)
printf(
"X");
}
printf(
"\n");
}
printf(
"\n");
if(go(1,1)==0) //设置了起始点为1,1
printf("没有路径!\n");
else
for(k=0;k<12;k++) //输出迷宫
{
for(l=0;l<12;l++)
{
if(a[k][l]==0)
printf(
"");
if(a[k][l]==1)
printf(
"X");
if(a[k][l]==2)
printf(
"*");
}
printf(
"\n");
}
}

这次是在递归回调的时候多加了个return 导致结果回到起始点就停止了,后来发现原来是自己跟上次的斐波那契数列的计算给搞混了,害我浪费了N久时间,悲剧啊!

原文地址:https://www.cnblogs.com/ruofengzhishang/p/1938627.html