// 迷宫问题.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#define M 4
#define N 4
#define MaxSize 100
int mg[M + 2][N + 2] = {
{1,1,1,1,1,1},
{1,0,0,0,0,1},
{1,0,1,0,0,1},
{1,1,0,1,0,1},
{1,0,0,0,0,1},
{1,1,1,1,1,1}
};
struct
{
int i;int j; int di;
}Stack[MaxSize],Path[MaxSize]; // 定义栈和最短路径的数组
// 初始化
int top = -1;
int count = 1;
int minlen = MaxSize;
void mgpath()
{
int i, j, di, find, k;
top++;
Stack[top].i = 1;
Stack[top].j = 1;
Stack[top].di = -1;
mg[1][1] = -1;
//所有方向走完,回到初始点,退出栈,站内为空
while (top>-1)
{
i = Stack[top].i;
j = Stack[top].j;
di = Stack[top].di;
// 走出迷宫,打印当前路线信息,比较路径长度,找出最短路径。
if (i == M && j == N)
{
printf_s("%4d:", count++);
for (k = 0; k <= top; k++)
{
printf_s("(%d,%d) ", Stack[k].i, Stack[k].j);
if ((k + 1) % 5 == 0)
{
printf_s("\n\t");
}
}
printf_s("\n");
if (top + 1 < minlen)
{
for (k = 0; k <= top; k++)
{
Path[k] = Stack[k];
}
minlen = top + 1;
}
// 开始回溯路径,寻找其他路径
mg[Stack[top].i][Stack[top].j] = 0;
top--;
i = Stack[top].i;
j = Stack[top].j;
di = Stack[top].di;
}
find = 0;
while (di<4&&find==0)
{
di++;
// 迷宫方向选择(上、右、下、左)
switch (di)
{
case 0: // 向上
i = Stack[top].i - 1;
j = Stack[top].j;
break;
case 1: // 向右
i = Stack[top].i;
j = Stack[top].j + 1;
break;
case 2: // 向下
i = Stack[top].i + 1;
j = Stack[top].j;
break;
case 3: // 向左
i = Stack[top].i;
j = Stack[top].j - 1;
break;
}
if (mg[i][j] == 0)
{
find = 1;
}
}
if (find == 1) // 找到下一个可走节点
{
Stack[top].di = di; // 更改原栈顶元素的方向di值,小于di方向已走,大于di方向未走。
top++; // 可走节点入栈,
Stack[top].i = i;
Stack[top].j = j;
Stack[top].di = -1; // 可走节点方向从-1开始到3进行判断下一个可走节点
mg[i][j] = -1; //避免重复走到节点
}
else // 没有路径可走,则退栈(所有信息下次入栈时重新初始化)
{
mg[Stack[top].i][Stack[top].j] = 0; //最后初始节点所有方向走完,无可走节点,退栈,栈空
top--;
}
}
// 打印迷宫最短路径。
if (minlen >= MaxSize)
{
printf_s("迷宫没有出口:\n");
}
else
{
printf_s("最短路径如下:\n");
printf_s("长度:%d \n", minlen);
for (k = 0; k < minlen; k++)
{
printf_s("(%d,%d)", Path[k].i, Path[k].j);
if ((k + 1) % 5 == 0)
{
printf_s("\n\t");
}
}
}
}
int main()
{
int i=0;
mgpath();
scanf_s("%d", i);
return 0;
}