求解迷宫问题(队列)

目录

算法描述

用一个队列q来存储记录走过的坐标
在这里插入图片描述
经过多次记录后:在这里插入图片描述
对应的迷宫路径示意图如下:
在这里插入图片描述
则读出来的迷宫路径坐标如下:
在这里插入图片描述
我们开始敲代码吧:

代码部分

准备工作:

1. 建立迷宫

	**//对应的数组下标 0 1 2 3 4 5 6 7 8 9**
	int a[][10]={	1,1,1,1,1,1,1,1,1,1,
					1,-1,1,0,0,0,1,1,1,1,//起点为-1 
					1,0,0,0,0,0,1,0,0,1,
					1,0,1,0,0,0,1,0,0,1,
					1,0,1,1,1,1,0,0,1,1,
					1,0,0,0,0,1,0,0,1,1,
					1,0,1,1,0,0,0,1,1,1,
					1,0,0,0,0,1,0,0,0,1,
					1,1,1,1,1,1,1,0,0,1,
					1,1,1,1,1,1,1,1,1,1};

2. 建立顺序队列等

#define Maxze 50 
typedef struct	//对应一个坐标
{
	int hang;	//第几行
	int lie;	//第几列
	int qian;	//由第几个坐标得来的
}ElemType;
 
typedef struct
{
	ElemType data[Maxze];		//用来记录坐标的数组
	int front,rear;				//队列的两个指针
}SqQueue;

重点部分

3. 开始建立队列的基本操作

//1.初始化队列
void IniterQueue(SqQueue *&q)
{
	q=new SqQueue;
	q->front=-1;
	q->rear=-1;
} 

//2.销毁队列
void DestroyQueue(SqQueue *&q)
{
	delete q;
}

//3.判断是否空队列 
bool QueueEmpty(SqQueue *q) 
{
	if(q->front==q->rear)
		return true;
	else 
		return false;
}

//4.判断是否满队列
bool QueueFull(SqQueue *q)
{
	if(q->rear==Maxze-1)
		return true;
	else 
		return false;
} 

//5.入队
bool enQueue(SqQueue *&q,ElemType e)
{
	if(q->rear==Maxze-1)		//队满上溢出
		return false;
	q->rear++;
	q->data[q->rear]=e;
		return true;
}

//6.出队
bool deQueue(SqQueue *&q,ElemType &e)
{
	if(q->front==q->rear)		//队空下溢出
		return false;
	q->front++;
	e=q->data[q->front];
		return true;
} 

4. 迷宫内的操作

//7.终点回溯起点 
void Huishuo(SqQueue *&q,int e)//输出迷宫所有坐标(1:障碍,0:可走
{
	a[8][8]=-2;					//-1:MIgongQueue函数途径坐标,-2:起点到终点的路线 
	int eh=8,el=8;
	while(eh!=1||el!=1)
	{
		eh=q->data[e].hang;
		el=q->data[e].lie;			//用eh,el截取坐标 
		e=q->data[e].qian;			// e等于该坐标的上一个路线对应坐标 
		a[eh][el]=-2;
	}
} 
//8.起点找到终点 
bool MigongQueue(SqQueue *&q)
{
	int eh,el,eq;
	ElemType e;
	e.hang=1,e.lie=1,e.qian=-1;		//将迷宫起点入队 
	enQueue(q,e);
	while(!QueueFull(q))
	{
		deQueue(q,e);
		eh=e.hang,el=e.lie,eq=q->front;
		if(a[eh-1][el]==0) 				//将其附近可走的点进队 
		{
			e.hang=eh-1;	e.lie=el;	e.qian=eq;
			enQueue(q,e);
			a[e.hang][e.lie]=-1; 
			if(e.hang==8&&e.lie==8) 		//当到达终点时回溯到起点,并结束 
			{
				Huishuo(q,eq);
				return true;
			}
		}
		if(a[eh][el+1]==0) 
		{
			e.hang=eh;	e.lie=el+1;		e.qian=eq;
			enQueue(q,e);
			a[e.hang][e.lie]=-1; 
			if(e.hang==8&&e.lie==8) 		//当到达终点时回溯到起点,并结束
			{
				Huishuo(q,eq);
				return true;
			}
		}
		if(a[eh+1][el]==0) 
		{
			e.hang=eh+1;	e.lie=el;	e.qian=eq;
			enQueue(q,e);
			a[e.hang][e.lie]=-1;
			if(e.hang==8&&e.lie==8) 		//当到达终点时回溯到起点,并结束
			{
				Huishuo(q,eq);
				return true;
			} 
		}
		if(a[eh][el-1]==0) 
		{
			e.hang=eh;     e.lie=el-1;		e.qian=eq;
			enQueue(q,e);
			a[e.hang][e.lie]=-1; 
			if(e.hang==8&&e.lie==8) 		//当到达终点时回溯到起点,并结束
			{
				Huishuo(q,eq);
				return true;
			}
		}
	}
	return false; 
} 

5. 输出迷宫

//9.输出迷宫
void DispQueue() 
{
	int i=0,j=0;
	for(i=0;i<10;++i)	//可选择输出整个迷宫图样或输出所有路线坐标 
	{
		for(j=0;j<10;j++)//输出迷宫所有坐标(1:障碍,0:可走, 
		{	
			if(a[i][j]==-2) 
			{
				cout<<"  1  ";		//-1:MIgongQueue函数途径坐标,-2:起点到终点的路线) 
				//cout<<a[i][j]<<"    ";
			} 
			else if(a[i][j]==0||a[i][j]==-1) cout<<"  0  ";
			else cout<<"  *  ";
		}
		cout<<endl<<endl;
	}
}

结尾部分

6. 主函数操作

int main()
{
	cout<<"迷宫的样式:\n";
	DispQueue();
	
	SqQueue *q;
	IniterQueue(q);		//建立队列,执行迷宫函数 
	MigongQueue(q);
	
	cout<<"迷宫的路线\n";
	DispQueue();
	
	DestroyQueue(q);
} 

运行结果

0代表可走,1代表已走路线,*表示障碍
由于该算法中,只要终点坐标入队,就会结束并输出,所以该路线为最优解路线,由图中也可看出。

代码分享到此结束,新人写的哪里不对,各位大佬可以尽情指导,谢谢啦.

发布了3 篇原创文章 · 获赞 1 · 访问量 63

猜你喜欢

转载自blog.csdn.net/Nothing_Wzy/article/details/105549801