解决迷宫问题, 栈和队列

#include<iostream>
using namespace std;

const int M = 10, N = 10;
int mg[M+1][N+1]={	 /*M=10,N=10*/
	{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}}; 
	
	const MaxSize = 200;
	struct 
	{	   
		int i,j;			/*方块的位置*/
		int pre;			/*本路径中上一方块在Qu中的下标*/
	} Qu[MaxSize];
	int front=-1,rear=-1;	/*队首指针和队尾指针*/
	
	
	//(1)首先将(1,1)入队;
	//(2)在队列Qu不为空时循环:出队一次(由于不是环形队列,该出队元素仍在队列中),称该出队的方块为当前方块,front为该方块在Qu中的下标。
	//	①如果当前方块是出口,则输出路径并结束。
	//	②否则,按顺时针方向找出当前方块的四个方位中可走的相邻方块(对应的mg数组值为0),将这些可走的相邻方块均插入到队列Qu中,其pre设置为本搜索路径中上一方块在Qu中的下标值,也就是当前方块的front值,并将相邻方块对应的mg数组值置为-1,以避免回过来重复搜索。
	//(3)若队列为空仍未找到出口,即不存在路径。 
	void mgpath()
	{
		cout << "start...";
		++rear;
		Qu[rear].i = 1; Qu[rear].j = 1; Qu[rear].pre = -1;
		
		int i, j;
		
		bool find = false;
		while (front <= rear && !find)
		{
			++front;
			if (Qu[front].i == M-2 && Qu[front].j == N-2)
			{
				find = true;
				cout << front;
				
				int tmp = front;
				while (tmp != -1)
				{
					cout << "	";
					cout << Qu[tmp].i << "," << Qu[tmp].j;
					tmp = Qu[tmp].pre;
				}
				return;
			}
			
			int dir = 0;
			while (dir < 4)
			{
				switch (dir)
				{
				case 0:
					i = Qu[front].i-1; j = Qu[front].j;
					break;
				case 1:
					i = Qu[front].i; j = Qu[front].j+1;
					break;
				case 2:
					i = Qu[front].i+1; j = Qu[front].j;
					break;
				case 3:
					i = Qu[front].i; j = Qu[front].j-1;
					break;
				}
				
				if (mg[i][j] == 0)
				{
					++rear;
					Qu[rear].i = i; Qu[rear].j = j; Qu[rear].pre = front;
					mg[i][j] = -1;
				}
				
				++dir;
			}
		}
		
		cout << "err";
	}
	
	int main()
	{
		mgpath();
		
		return 0;
}

const MaxSize = 100;
struct 
{     
	int i;		/*当前方块的行号*/
	int j;	    /*当前方块的列号*/
	int di;		/*di是下一可走相邻方位的方位号*/
} Stack[MaxSize];	/*定义栈*/
int top=-1;		/*初始化栈指针*/

void mgpath()	/*路径为:(1,1)->(M-2,N-2)*/
{  
	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-2 && j==N-2)	/*找到了出口,输出路径*/
		{     printf("迷宫路径如下:\n");
		for (k=0;k<=top;k++)
		{     
			printf("\t(%d,%d)",Stack[k].i,Stack[k].j);
			if ((k+1)%5==0)		 
				printf("\n"); 
		}
		}
		printf("\n");
		return; 
		
		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值*/
			top++;   /*下一个可走方块进栈*/
			Stack[top].i=i;Stack[top].j=j;Stack[top].di=-1;
			mg[i][j]=-1;	/*避免重复走到该方块*/
		}
		else	   /*没有路径可走,则退栈*/
		{    
			mg[Stack[top].i][Stack[top].j]=0;
			/*让该位置变为其他路径可走方块*/
			top--;
		}
		
    }  
	
	printf("没有可走路径!\n");
	
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/yukuaishi/article/details/7541967
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞