1. 程式人生 > >C++廣度優先搜尋演算法之走迷宮

C++廣度優先搜尋演算法之走迷宮

走迷宮

題目描述

一個網格迷宮由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(); }