C++廣度優先搜尋演算法之走迷宮
阿新 • • 發佈:2019-02-03
走迷宮
題目描述
一個網格迷宮由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();
}