c语言之迷宫问题

本文介绍了一种使用回溯法解决迷宫寻路问题的方法,通过定义一个二维数组表示迷宫,并利用栈来记录每一步的行走状态,最终找到从起点到终点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,未经博主允许不得转载。


定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 

int maze[5][5] {

        0, 1, 0, 0, 0,

        0, 1, 0, 1, 0,

        0, 0, 0, 0, 0,

        0, 1, 1, 1, 0,

        0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0

0

0

0

0

Sample Output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)

输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
//c语言,用的回溯,栈。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Maxsize 100
struct                   //i,j为当前位置,di为下一个前进的位置,上,右,下,左,分别对应0,1,2,3;
{
    int i;
    int j;
    int di;
}Stack[Maxsize],Path[Maxsize];
int main()
    {
    int M,N;
    while(scanf("%d %d",&M,&N)!=EOF)
    {
        int i,j,k,di,find,mg[10][10];
        int top=-1,minlen=Maxsize;
        memset(mg,0,sizeof(mg));
        for(i=1;i<=M;i++)//输入模块
            for(j=1;j<=N;j++)
                scanf("%d",&mg[i][j]);
        for(i=0;i<=N+1;i++)//两个for循环把输入数组的四周全部变成1,防止越界
        {
            mg[0][i]=1;
            mg[M+1][i]=1;
        }
        for(j=1;j<=M;j++)
        {
            mg[j][0]=1;
            mg[j][N+1]=1;
        }
        top++;
        Stack[top].i=1;
        Stack[top].j=1;
        Stack[top].di=-1;
        mg[1][1]=-1;
        while(top>-1)    //输出模块
        {
            i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
            if(i==M&&j==N)
            {
                if(top+1
                {
                    for(k=0;k<=top;k++)
                        Path[k]=Stack[k];
                    minlen=top+1;
                }
                mg[Stack[top].i][Stack[top].j]=0;
                top--;
                i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
            }
            find=0;
            while(di<4&&find==0)
            {
                di++;
                switch(di)
                {
                case 0:i=Stack[top].i-1;j=Stack[top].j;break;
                case 1:i=Stack[top].i;j=Stack[top].j+1;break;
                case 2:i=Stack[top].i+1;j=Stack[top].j;break;
                case 3:i=Stack[top].i;j=Stack[top].j-1;break;
                }
                if(mg[i][j]==0)
                    find=1;
            }
            if(find==1)
            {
                Stack[top].di=di;
                top++;
                Stack[top].i=i;
                Stack[top].j=j;
                Stack[top].di=-1;
                mg[i][j]=-1;//进栈,防止重复,把当前值改为-1;
            }
            else         //退栈的话,当前值置为0
            {
                mg[Stack[top].i][Stack[top].j]=0;
                top--;
            }
        }
        for(k=0;k
            printf("(%d,%d)\n",(Path[k].i-1),(Path[k].j-1));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值