数据结构与算法 迷宫求解 找出从入口到出口的路径 c语言

关注私信免费获取源码

运行截图

在这里插入图片描述

核心函数

void FindOut(int** maze, PosType Start, PosType End) {//寻找出路
    SqStack S;
    S.base = 0;
    S = InitStack(S);

    PosType curpos;//当前位置
    curpos.i = Start.i;
    curpos.j = Start.j;

    SElemType e;//当前通道块

    int curstep = 1;//探索第一步;
 
    do {
        if (maze[curpos.i][curpos.j] == 1) {
            maze[curpos.i][curpos.j] = 2;//表示留下足迹

            e.di = 1;
            e.seat.i = curpos.i;
            e.seat.j = curpos.j;
            e.ord = curstep;

            S = Push(S, e);//加入路径

            if (curpos.i == End.i && curpos.j == End.j)//到达终点
                break;
            curpos = NextPos(curpos, 1);
            curstep++;//探索下一步
        }//if
        else {
            if (!IsEmpty(S)) {
                e = GetTop(S);//由于Pop的不完善,所以这两步加起来才是真正的Pop功能,下同
                S = Pop(S);
                curstep--;
                while (e.di == 4 && !IsEmpty(S)) {
                    maze[e.seat.i][e.seat.j] = 3;//3表示不能通过的标记
                    e = GetTop(S);
                    S = Pop(S);
                    curstep--;
                }
                if (e.di < 4) {
                    e.di++;
                    S = Push(S, e);
                    curstep++;
                    curpos = NextPos(e.seat, e.di);
                }//if
            }//if
        }//else
    } while (!IsEmpty(S));

    if (IsEmpty(S)) {
        maze[Start.i][Start.j] = 1;//因为无论如何起点都会留下足迹
        printf("\n无解");
    }//if
    else {//打印路径
        PosType* Path=new PosType[curstep];
        //PosType Path[curstep];
        int  i;
        while (!IsEmpty(S)) {
            e = GetTop(S);
            S = Pop(S);
            Path[e.ord - 1].i = e.seat.i;//ord是从1开始计算的,而数组是从0开始
            Path[e.ord - 1].j = e.seat.j;
        }//while
        for (i = 0; i < curstep - 1; i++)//最后一个单独打印
            printf("(%d,%d) -> ", Path[i].i, Path[i].j);
        printf("(%d,%d)\n", Path[i].i, Path[i].j);
    }//else

    DestroyStack(S);
}//FindOut

这段代码使用了栈(SqStack)来保存路径信息,并使用深度优先搜索算法来遍历迷宫。在每一步中,根据当前位置和方向进行判断,如果当前位置是可通行的(值为1),则将其标记为已访问(值设为2),并将该位置的信息压入栈中。然后更新当前位置,继续探索下一步。如果当前位置不可通行,则从栈中弹出上一个位置的信息,并尝试其他方向。如果到达终点,则跳出循环。

实现逻辑

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员printf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值