为什么会把死胡同末端的方块显示出来


#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
#define M 8
#define N 8
typedef struct//定义方块类型
{
    int x;
    int y;
    int di;
}box;

int mg[M + 2][N + 2] =
{
    {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 mglj(int xi, int yi, int xe, int ye) 
{
    box lj[100], e{}; int x, y, di, x1, y1, k; bool find;
    stack<box>st;
    e.x = xi; e.y = yi; e.di = -1;
    st.push(e);
    mg[xi][yi] = -1;
    while (!st.empty())
    {
        x = st.top().x; y = st.top().y; di = st.top().di;
        if (x== xe && y == ye)
        {
            cout << "迷宫路径如下" << endl;
            k = 0;
            while (!st.empty())
            {
                lj[k++] = st.top();
                st.pop();
            }
            while (k >= 1)
            {
                k--;
                cout << lj[k].x <<"," << lj[k].y << "," << lj[k].di<< endl;
                if ((k + 2) % 5 == 0)
                    cout << "\n" << endl;
            }
            cout << "\n" << endl;
            return true;
        }
        find = false;
        while (di < 4 && !find)
        {
            di++;
            switch (di)
            {
            case 0:x1 = x - 1; y1 = y; break;
            case 1:x1 = x; y1 = y + 1; break;
            case 2:x1 = x + 1; y1 = y; break;
            case 3:x1 = x; y1 = y - 1; break;
            }
            if (mg[x1][y1] == 0)
                find = true;
        }
        if (find)
        {
            st.pop();
            e.di = di;
            st.push(e);
            e.x = x1; e.y = y1; e.di = -1;
            st.push(e);
            mg[x1][y1] = -1;
        }
        else
        {
            st.pop();
            mg[e.x][e.y] = 0;
        }
    }
    return false;
}
int main()
{
    if (!mglj(1, 1, M, N))
        cout << "该迷宫问题没有解!" << endl;
    return 1;
}

img


为什么会把死胡同末端的方块显示出来?
我发现把这里修改一下就可以了

st.pop();
e.di = di;
st.push(e);
改成
st.top().di=di;

但是为什么呢,删除在添加和替换有什么区别?

删除再添加和修改到底有什么区别
因为修改的时候你只修改了id
而删除再添加你还是只给id赋值
你先看看栈顶的x和y和e的xy一样吗

调试下,看看边界判断,存在错误

因为在迷宫算法中,当搜索到死胡同时,会弹出栈顶元素并回溯到前一个位置,然后将该位置标记为未访问过。但是在你实现的这个算法中,当回溯到前一个位置时,它并没有将该位置的方向信息更新为下一个方向,而是保留了原来的方向信息,这就导致了在输出路径时会把死胡同末端的方块显示出来。

可以尝试这样修改,不知道对不对,你试一下:

else
{
st.pop();
mg[e.x][e.y] = 0;
}

应该加上下面的语句:

else
{
st.pop();
mg[e.x][e.y] = 0;
st.top().di = di;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/164302
  • 这篇博客你也可以参考下:查找两个有序数组相同的数据
  • 这篇博客也不错, 你可以看下查找两个有序数组相同的数据
  • 除此之外, 这篇博客: 考核题1中的 16.什么是堆栈?什么是内存溢出?有垃圾回收机制为什么还会出现内存溢出的情况? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    堆栈就是只能在一端插入和删除数据的链表,这个端就叫做栈顶(top),最后一个添加的数据第一个被删除。因此,这也叫后进先出(LAST IN FIRST OUT)链表或是先进后出链表(FIRST IN LAST OUT)。

    内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的

    内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出

    有垃圾回收机制为什么还会出现内存溢出的情况?

    内存资源是有限的,垃圾回收只回收垃圾,对于你的程序运行有用的对象不会被回收。

    内存溢出分两种情况一种是栈溢出,比如调用了一个无限递归。还有一种是堆溢出,即new出来的对象没有即使销毁,比如一直new


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^