数据结构-迷宫

// 迷宫问题.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;
}

  

原文地址:https://www.cnblogs.com/tuqunfu/p/7545769.html