发现递归算法真的是个神奇的东西,还会自己在栈中记录下以前的数据,可以按照以前的记录返回到起始点,这个电子老鼠走迷宫是个很好的例子。研究了一个下午,总算还是有点收获的,突然对扫雷这个游戏有点感悟了。其实都是相同的道理。
电子老鼠闯迷宫代码如下:
代码
#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");
}
}
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久时间,悲剧啊!