BFS广度优先搜索 (迷宫问题)

广度优先搜索的基本思想:从图中一个未遍历的结点出发,先遍历这个结点相邻结点,再依次遍历相邻结点的相邻结点。

迷宫有n行m列单元格组成,每个单元格都是空地或者障碍物,求出从起点到终点的最短路径长度。

算法步骤:

(x-1,y)上
(x,y-1)左 (x,y) (x,y+1)右
(x+1,y)下

1.将起点入队;

2.队首结点可扩展的点入队,如果没有可扩展的点,将队首结点出队。重复该步骤,直到到达目标位置或队列为空。

其中#为阻碍物;

起点0 1 #
1
#
#
#

利用队列

从起点零出发 ,可从下和右拓展,起点零的结点(1,1,0)表示第一行第一列步数为0,可以自己设置顺序向某一方向拓展,这里使用右下左上顺序进行拓展,拓展之后有两个结点(1,2,1)(2,1,1)

(1,1,0) (1,2,1) (2,1,1)

拓展后,队首出队;

(1,2,1) (2,1,1)

然后按顺序对队首进行拓展:

起点0 1 #
1 2
#
#
#

拓展完之后队首出队,新结点入队:

(2,1,1) (2,2,2)

按照这样的思想逐步进行,最终得到:

起点0 1 # 5
1 2 3 4
2 3 # 5
3 # 终点7 6
4 5 6 #

  

#include
using namespace std;
struct point
{
	int x;
	int y;
	int step;
};
queue r;//申请队列
 int dx[4]={0,1,0,-1};//四个方向右下左上进行扩展 
 int dy[4]={1,0,-1,0};
int flag=0; 
int a[100][100];
int v[100][100];	




int main()
{
	//输入
	int n,m,startx,starty,p,q;//起始点 终点 
	 scanf("%d%d",&n,&m);
	 for(int i=1;i<=n;i++)
	   for(int j=1;j<=m;j++)
	     scanf("%d",&a[i][j]);
	 	
	scanf("%d%d%d%d",&startx,&starty,&p,&q);
	//BFS
	point start;
	start.x=startx;
	start.y=starty;
	start.step=0;
	r.push(start);//将起点入队
	v[startx][starty]=1;//已经访问 
	while(!r.empty()) 
	{
		int x =r.front().x,y=r.front().y;
		if(x==p &&y==q)//假如已经到终点 
		{   flag=1;
			printf("%d",r.front().step);
			break;
		}
		for(int k=0;k<=3;k++)
		{
			int tx,ty;
			tx =x +dx[k];
			ty=y+dy[k];
			if(a[tx][ty]==1&&v[tx][ty]==0)
			{
				//入队
				point temp;
				temp.x=tx;
				temp.y=ty;
				temp.step=r.front().step+1;
				r.push(temp) ;
				v[tx][ty]=1;//已经被访问 
				
			}
		}r.pop();//拓展完了需要将队首元素出队;
	}
	
	 if (flag==0)
	  printf("no answer;");
 return 0;
}
/*5 4
1 1 2 1
1 1 1 1 
1 1 2 1 
1 2 1 1 
1 1 1 2
1 1 4 3

/*输入 

执行结果如下:

BFS广度优先搜索 (迷宫问题)_第1张图片

你可能感兴趣的:(编程算法,宽度优先,数据结构,算法)