采用顺序栈以及回溯法,一个比较简单的问题,但是从来没有写过,也算是弥补一下自己欠数据结构的债吧,居然也花了一个半小时,无地自容了。。
定义好数据结构求解算法就显得容易一些了。
struct Box
{
int i;
int j;
int di;
};
struct stType
{
Box data[MaxSize];
int top;
};
整体算法:
bool mgpath(int i, int j, int M, int N)
{
stType st;
st.top = 0;
st.data[st.top].i = i;
st.data[st.top].j = j;
st.data[st.top].di = -1;
mg[i][j] = -1;
while (st.top > -1)
{
if (st.data[st.top].i == M && st.data[st.top].j == N )
{
std::cout << "迷宫路径为:" << std::endl;
for (int k = 0; k < st.top; ++k)
{
std::cout << "(" << st.data[k].i << ", " << st.data[k].j << ") ";
if ((k + 1) % 4 == 0)
{
std::cout << std::endl;
}
}
std::cout << "(" << M << ", " << N << ") ";
std::cout << std::endl;
return true;
}
int find = 0;
int di = st.data[st.top].di;
++di;
int ii, jj;
while (0 == find && 4 > di)
{
switch (di)
{
case 0: ii = st.data[st.top].i - 1, jj = st.data[st.top].j; break;
case 1: ii = st.data[st.top].i, jj = st.data[st.top].j + 1; break;
case 2: ii = st.data[st.top].i + 1, jj = st.data[st.top].j; break;
case 3: ii = st.data[st.top].i, jj = st.data[st.top].j - 1; break;
}
if (mg[ii][jj] == 0)
{
find = 1;
}
else
{
++di;
}
}
if (1 == find)
{
st.data[st.top].di = di;
++st.top;
st.data[st.top].i = ii;
st.data[st.top].j = jj;
st.data[st.top].di = -1;
mg[ii][jj] = -1;
}
else
{
--st.top;
}
}
return false;
}
完整代码:https://gitee.com/feistel/codes/06b241nc59uifelwprms756