#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;
}
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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:堆栈就是只能在一端插入和删除数据的链表,这个端就叫做栈顶(top),最后一个添加的数据第一个被删除。因此,这也叫后进先出(LAST IN FIRST OUT)链表或是先进后出链表(FIRST IN LAST OUT)。
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的
内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出有垃圾回收机制为什么还会出现内存溢出的情况?
内存资源是有限的,垃圾回收只回收垃圾,对于你的程序运行有用的对象不会被回收。
内存溢出分两种情况一种是栈溢出,比如调用了一个无限递归。还有一种是堆溢出,即new出来的对象没有即使销毁,比如一直new。