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久时间,悲剧啊!

你可能感兴趣的:(C语言)