迷宫问题——最简单的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;
}