您的位置:首页 > 编程语言 > C语言/C++

C++广度优先搜索算法之走迷宫

2017-06-13 22:42 344 查看
走迷宫

题目描述

一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0表示)。你的任务是找一条从起点到终点的最短移动序列。用U、D、L、R分别表示往上、下、左、右移动到相邻单元格。不能走到障碍物上,也不能走出迷宫。起点和终点保证是空地,保证从起点到终点一定存在至少一条路径。

输入

第1行:2个整数n和m,分别表示行数和列数(n,m <=100)

接下来n行,每行m个0、1数字,描述迷宫

最后1行:4个整数x1, y1, x2, y2,分别表示起点和终点的行号和列号,行和列均从1开始编号

输出

第1行:一个字符串,表示起点到终点的移动序列。若有多个方案,任一个方案均可。

样例输入

5 5

0 0 0 1 0

1 0 1 1 1

1 1 1 0 0

0 1 0 0 0

1 1 1 0 0

2 5 5 3

样例输出

LLDLDDR

这道题是广度优先搜索算法的一道经典例题。

代码如下:

#include<cstdio>
#include<cstdlib>
int head=0,tail=1,nextx,nexty,n,m,beginx,beginy,endx,endy;
int pre[100000],a[100000],b[100000],map[200][200];
int x[4]={-1,1,0,0},y[4]={0,0,-1,1};
bool mark[200][200];
char way[100000],word[4]={'U','D','L','R'};
void find(int x)
{
if(pre[x]!=0)
{
find(pre[x]);
printf("%c",way[x]);
}
}
bool check(int x,int y)
{
if(x<=n&&y<=m&&x>0&&y>0) return 1;
return 0;
}
void bfs()
{
a[1]=beginx;
b[1]=beginy;
mark[beginx][beginy]=1;
while(head!=tail)
{
head++;
for(int i=0;i<4;i++)
{
nextx=a[head]+x[i];
nexty=b[head]+y[i];
if(check(nextx,nexty)&&!mark[nextx][nexty]&&map[nextx][nexty]==1)
{
tail++;
a[tail]=nextx;
b[tail]=nexty;
pre[tail]=head;
way[tail]=word[i];
mark[nextx][nexty]=1;
if(a[tail]==endx&&b[tail]==endy)
{
find(tail);
printf("\n");
exit(0);
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
scanf("%d%d%d%d",&beginx,&beginy,&endx,&endy);
bfs();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息