C语言用递归函数实现迷宫求解(无数据结构)

 不多说废话,直接上代码,代码里面有注释,也比较清楚了。

主要是采用了递归,比较初级的思想,代码整体也比较简单,希望我的这一点点东西能帮助到你,能够帮助到你是我莫大的荣幸。

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define N 50


void OutPut(char maze[N][N]);
void Init(int array[N][N],char maze[N][N]);
int FindWay(char maze[N][N],int array[N][N],int x,int y,int x2,int y2);//输入起点和终点坐标
int array[N][N];//将迷宫数字化,0代表空格,1代表墙
char maze[N][N]=
    {
     {'#','#','#','#','#','#','#','#','#','#'},
     {'0','0','0','0','0','0','0','0','0','#'},
     {'#','0','#','0','#','0','#','#','0','#'},
     {'#','0','#','0','#','0','#','#','0','#'},
     {'#','0','#','0','#','0','#','#','0','#'},
     {'#','0','0','0','0','0','0','0','0','#'},
     {'#','#','#','0','#','#','#','0','#','#'},
     {'#','#','#','0','0','#','0','0','0','#'},
     {'#','#','#','0','#','#','#','0','0','0'},
     {'#','#','#','#','#','#','#','#','#','#'},
     };//定义迷宫大小,并设置一个10*10的迷宫.用空格表示空气,#表示墙
int main()
{
     int success=0;
     Init(array,maze);
     OutPut(maze);//输出之后选择是否出答案
     printf("按A出答案,按B退出\n");
     while(1)
     {
         if (_kbhit()) //如果有键盘输入 conio.h里面的函数
            {
                switch (_getch())
                {
                case 'A': case 'a':break;//表示出答案
                case'B':case'b':exit(0);//stdlib.h里面的结束函数
                break;
                }
                break;
            }
     }
         if(FindWay(maze,array,1,0,8,9)==0)
         {
             printf("此迷宫无解!!\n");
         }
    return 0;
}

int FindWay(char maze[N][N],int array[N][N],int x,int y,int x2,int y2)//用四个if语句表示四个都要执行
{
    int temp=0;
    array[x][y]=8;//设置光标路径
    maze[x][y]='@';//小老鼠
    system("cls");//清空屏幕
    OutPut(maze);
    array[x][y]=1;//显示完后对走过路径标记
    maze[x][y]=' ';
    Sleep(250);//刷新频率
    if(x==x2&&y==y2)//到达终点
    {
        temp=1;//有解
        printf("此迷宫的解已输出!!\n");
        system("PAUSE");//按一下才会结束,给用户良好体验
        exit(0);
    }
    if(temp!=1&&array[x][y+1]==0&&y+1<=9)//还未找到解,并且右边有路
    {
        FindWay(maze,array,x,y+1,x2,y2);
    }
    if(temp!=1&&array[x][y-1]==0&&y-1>=0)//还未找到解,左边有路
    {
        FindWay(maze,array,x,y-1,x2,y2);
    }
    if(temp!=1&&array[x-1][y]==0&&x-1>=0)//向下
    {
        FindWay(maze,array,x-1,y,x2,y2);
    }
    if(temp!=1&&array[x+1][y]==0&&x+1<=9)//向上
    {
        FindWay(maze,array,x+1,y,x2,y2);
    }
    if(temp!=1)//四周无路并且还未找到解,往回退回
    {
        array[x][y]=0;
        maze[x][y]='#';//此路不通,把它堵住
    }
    return temp;
}
void Init(int array[N][N],char maze[N][N])
{
    for(int i=0;i<10;i++)//遍历迷宫
    {
        for(int j=0;j<10;j++)
        {
            if(maze[i][j]=='#')//●
            {
                array[i][j]=1;//表示墙壁
            }
            else if(maze[i][j]=='0')
            {
                array[i][j]==0;//表示有路
            }
        }
    }
}
void OutPut(char maze[N][N])
{
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            printf("%2c",maze[i][j]);
        }
        printf("\n");
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值