数据结构--用栈求解迷宫问题(非最优解)

在贺老师指出问题之后才发现原来书上代码是没问题的,完全是我的原因,不过这样也好,让我从刚开始的只懂了六七到了完全懂了,这也是一个过程,虽然我的编程能力不强但是我相信只要努力就会有结果的,专心于一件事!下面我犯的错可以忽略了。。。

栈顶的值被保留用于回溯时不重复走原来的路径!

分割线·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~QAQ

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。

BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子,这就造成了一个问题:(1,2)则个点会被进栈(因为(1,2)点位于(1,1)点的右边被先判断进栈),那么接下来的路径会变成固定的(1,1)->(1,2)->(2,2)->(3,2)->(3,3)->(3,4)->(2,4)->(1,4)->(1,5)->(1,6)->(2,6)->(2,5)

这样的话就会到(2,5)就会停止,根本不会达到查找其他路径的目的。

这里写图片描述

-------------------------------------------------

#include<iostream>
#include<malloc.h>
#define MaxSize 100
using namespace std;
typedef struct
{
    int i;
    int j;
    int di;
} Box;
typedef struct
{
    Box data[MaxSize];
    int top;
} StType;
  int mg[10][10]=
        {
            {1,1,1,1,1,1,1,1,1,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,0,0,1,1,0,0,1},
            {1,0,1,1,1,0,0,0,0,1},
            {1,0,0,0,1,0,0,0,0,1},
            {1,0,1,0,0,0,1,0,0,1},
            {1,0,1,1,1,0,1,1,0,1},
            {1,1,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,1,1}
        };
bool mgpath(int xi,int yi,int xe,int ye)
{
    int i,j,k,di,find;
    StType st;
    st.top=-1;
    st.top++;
    st.data[st.top].i=xi;
    st.data[st.top].j=yi;
    st.data[st.top].di=-1;
    mg[xi][yi]=-1;
    while(st.top>-1)
    {
        i=st.data[st.top].i;
        j=st.data[st.top].j;
        di=st.data[st.top].di;
        if(i==xe&&j==ye)
        {
            cout<<"迷宫路径如下:"<<endl;
            for(k=0; k<=st.top; k++)
            {
                cout<<"("<<st.data[k].i<<","<<st.data[k].j<<")";
                if((k+1)%5==0)
                    cout<<endl;
                }
            cout<<endl;
            return true;
        }
        find=0;
        while(di<4&&find==0)
        {
            di++;
            switch(di)
            {
            case 0:
                i=st.data[st.top].i-1;
                j=st.data[st.top].j;
                break;
            case 1:
                i=st.data[st.top].i;
                j=st.data[st.top].j+1;
                break;
            case 2:
                i=st.data[st.top].i+1;
                j=st.data[st.top].j;
                break;
            case 3:
                i=st.data[st.top].i;
                j=st.data[st.top].j-1;
                break;
            }
            if(mg[i][j]==0)
                find=1;
        }
        if(find==1)
        {
            st.data[st.top].di=di;
            st.top++;
            st.data[st.top].i=i;
            st.data[st.top].j=j;
            st.data[st.top].di=-1;
            mg[i][j]=-1;
        }
        else
        {
            mg[st.data[st.top].i][st.data[st.top].j]=0;
            st.top--;
        }
    }
    return false;
}
int main()
{
   mgpath(1,1,3,1);

}



 

目的点为(2,5)时

==============================

目的点为(3,1)时

 

好的,我可以为您编写一个使用 A* 搜索算法求解迷宫问题的程序。下面是程序的基本思路和实现步骤: 1. 定义迷宫地图:假设迷宫是一个 n 行 m 列的矩阵,用二维数组 maze 存储,其中 0 表示可通行的路径,1 表示障碍物。 2. 定义 A* 搜索算法的数据结构:我们需要维护一个 openList 和 closedList,分别用来存储待扩展的节点和已经扩展过的节点。每个节点包含自身的坐标 (x, y)、起始节点到该节点的路径长度 g(x,y)、该节点到目标节点的估计距离 h(x,y) 和 f(x,y) = g(x,y) + h(x,y)。 3. 初始化起点和终点:起点为 (start_x, start_y),终点为 (end_x, end_y)。 4. 将起点加入 openList 中,并将其 f 值设为 0。 5. 重复以下步骤直到 openList 为空或找到终点为止: 1)从 openList 中找出 f 值最小的节点,将其从 openList 中移除并加入 closedList 中。 2)判断该节点是否为终点,如果是,则返回路径;否则,继续执行下一步。 3)扩展该节点的邻居节点,计算它们的 f 值并将其加入 openList 中。 6. 如果 openList 已经为空但是还没有找到终点,则意味着无解。 7. 根据 closedList 中记录的节点信息,构建出最优路径并返回。 下面是伪代码实现: ``` function A_star(start_x, start_y, end_x, end_y, maze): openList = empty priority queue closedList = empty list initialize start node set start node f value to 0 add start node to openList while openList is not empty: current = node in openList with smallest f value remove current from openList add current to closedList if current is end node: return construct path from start to end for each neighbor of current: if neighbor is not traversable or neighbor is in closedList: continue calculate g value of neighbor calculate h value of neighbor calculate f value of neighbor if neighbor is not in openList or new f value is less than old f value: set parent of neighbor to current set f value of neighbor if neighbor is not in openList: add neighbor to openList return failure ``` 希望这个程序能够帮助您解决迷宫问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值