Eternal_GL 2023-03-24 12:53 采纳率: 33.3%
浏览 48
已结题

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


#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;

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

  • 写回答

4条回答 默认 最新

  • 於黾 2023-03-24 13:39
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 修改了问题 3月24日
  • 修改了问题 3月24日
  • 展开全部

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号