迷宫问题bfs

/*
迷宫问题
采用队列的广度优先遍历(BFS):思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域 
找到的解为最优解 
*/ 
#include<stdio.h>
#define M 8
#define N 8
#define MaxSize 1000
typedef struct
{
	int i,j;
	int pre;//该路径前一个节点 ,这个变量的定义很重要 
}Box;
typedef struct
{
	Box data[MaxSize];
	int front,rear;
}QuType;//迷宫问题队列结构体表示形式 
int mg[M+2][N+2]=
{
	{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}
}; 
QuType qu;
void print(int front)//递归打印最短路径 
{
	if(qu.data[front].pre!=-1)
	print(qu.data[front].pre);
	printf("(%d,%d)\t",qu.data[front].i,qu.data[front].j);
}
int mgpath(int xi,int yi,int xe,int ye)
{
	int i,j,di;
	qu.front=qu.rear=-1;
	qu.rear++;
	qu.data[qu.rear].i=xi;
	qu.data[qu.rear].j=yi;
	qu.data[qu.rear].pre=-1;
	mg[xi][yi]=-1;
	while(qu.front!=qu.rear)
	{
		qu.front++;
		i=qu.data[qu.front].i;
		j=qu.data[qu.front].j;
		if(i==xe&&j==ye)
		{
			print(qu.front);
			return 1;
		}
		for(di=0;di<4;di++)//广度搜索 
		{
			switch(di)
			{
				case 0:
					i=qu.data[qu.front].i-1;
					j=qu.data[qu.front].j;
					break;
				case 1:
					i=qu.data[qu.front].i;
					j=qu.data[qu.front].j+1;
					break;
				case 2:
					i=qu.data[qu.front].i+1;
					j=qu.data[qu.front].j;
					break;
				case 3:
					i=qu.data[qu.front].i;
					j=qu.data[qu.front].j-1;
					break;
			}
			if(mg[i][j]==0)
			{
				qu.rear++;
				qu.data[qu.rear].i=i;
				qu.data[qu.rear].j=j;
				qu.data[qu.rear].pre=qu.front;
				mg[i][j]=-1;
			}
		}
	}
	return 0;
}
int main()
{
	mgpath(1,1,M,N);
	return 0;
} 

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/molu_chase/article/details/44939985
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞