// 迷宫问题.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(" "); } } printf_s(" "); 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("迷宫没有出口: "); } else { printf_s("最短路径如下: "); printf_s("长度:%d ", minlen); for (k = 0; k < minlen; k++) { printf_s("(%d,%d)", Path[k].i, Path[k].j); if ((k + 1) % 5 == 0) { printf_s(" "); } } } } int main() { int i=0; mgpath(); scanf_s("%d", i); return 0; }