迷宫问题——最简单的bfs

迷宫问题——最简单的bfs

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

解题思路:

从(0,0)位置开始搜,递归结束的标志是到达右下角,注意一个小细节,用一个flag标记是否找到了结果,加一个退出标志 flag=1,用一个结构体数组记录路径,用book数组记录是否走过。代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef struct node{
	int x;
	int y;
}lj;
lj a[100];
int book[10][10];
int mp[10][10];
int flag=0;
int next[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y,int step)
{
	if(x==4&&y==4)
	{
		printf("(0, 0)\n");
		for(int i=0;i<step-1;i++)
			printf("(%d, %d)\n",a[i].x,a[i].y);
		printf("(%d, %d)",a[step-1].x,a[step-1].y);
		flag=1;
		return ;
	}
	if(flag==1)
		return ;
	for(int i=0;i<=3;i++)
	{
		int tx=x+next[i][0];
		int ty=y+next[i][1];
		if(tx<0||tx>=5||ty<0||ty>=5)
			continue;
		if(book[tx][ty]==1)
			continue;
		if(mp[tx][ty]==1)
			continue;
		book[tx][ty]=1;
		a[step].x=tx;
		a[step].y=ty;
		dfs(tx,ty,step+1);
		book[tx][ty]=0;
	}
}
int main()
{
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			cin>>mp[i][j];
	dfs(0,0,0); 
	 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43179892/article/details/83588413
今日推荐