noj->電子老鼠走迷宮
00 問題
有一隻電子老鼠被困在如下圖所示的迷宮中。這是一個12*12單元的正方形迷宮,黑色部分表示建築物,白色部分是路。電子老鼠可以在路上向上、下、左、右行走,每一步走一個格子。現給定一個起點S和一個終點T,求出電子老鼠最少要幾步從起點走到終點。
輸入:
本題包含一個測例。在測例的第一行有四個由空格分隔的整數,分別表示起點的坐標S(x.y)和終點的坐標T(x,y)。從第二行開始的12行中,每行有12個字元,描述迷宮的情況,其中'X'表示建築物,'.'表示路.
輸出:
輸出一個整數,即電子老鼠走出迷宮至少需要的步數。
輸入樣例:
2 9 11 8
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXXXX
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX
輸出樣例:
28
01 思路
01-1 類型
很明顯的一個迷宮了,並且要求出電子老鼠最少要幾步從起點走到終點,所以是廣搜類型。
01-2 演算法
-
第一步:設置入口出口和迷宮本體->init()函數
-
第二步:bfs主控函數:
-
隊列入出循環
-
生成四個節點 對四個節點進行判斷
-
如果新坐標為終點坐標,就返迴路徑長度
-
其他點:如果不是終點坐標,在迷宮內,未訪問過,不是牆,就入隊
-
入隊操作:
x.push(nextx);
y.push(nexty);
used[nextx][nexty]=1;
step[nextx][nexty]=step[prex][prey]+1; -
完成入隊出隊閉環。
-
-
-
輸出
-
02 程式碼
1 //電子老鼠闖迷宮 2 #include<iostream> 3 #include<queue> 4 5 using namespace std; 6 7 int map[13][13];//迷宮本體 8 int used[13][13]={0};//走過標記,0為未走,1為已走 9 int step[13][13]={0};//到達當前節點所走的步數 10 int inx,iny,outx,outy,prex,prey,nextx,nexty; 11 //分別是入口,出口,老位置、新位置 12 int dx[4] = {-1,1,0,0};//左右上下 13 int dy[4] = {0,0,-1,1};//左右上下 14 15 void init(); 16 int bfs(); 17 queue<int>x; 18 queue<int>y; 19 20 int main(){ 21 init();//初始化矩陣以及隊列 22 cout<<bfs()<<endl; 23 return 0; 24 } 25 void init(){ 26 int i,j; 27 char temp; 28 cin >> inx >> iny >> outx >> outy; 29 //初始化這個矩陣,方便起見,從1開始 30 for(i=1;i<13;i++){ 31 for(j=1;j<13;j++){ 32 cin>>temp; 33 if(temp == 'X'){ 34 map[i][j]=1; 35 } 36 else{ 37 map[i][j]=0; 38 } 39 } 40 } 41 //起點入隊 42 x.push(inx); 43 y.push(iny); 44 used[inx][iny]=1; 45 } 46 int bfs(){// 47 int i; 48 while(!x.empty()&&!y.empty()){ 49 prex = x.front(); 50 prey = y.front(); 51 x.pop(); 52 y.pop(); 53 //生成當前節點的四個子節點 54 for(i=0;i<4;i++){ 55 nextx = prex + dx[i]; 56 nexty = prey + dy[i]; 57 if(nextx==outx&&nexty==outy){ 58 //如果新坐標為終點坐標 59 return(step[prex][prey]+1); 60 } 61 if(nextx>0&&nextx<=12&&nexty>0&&nexty<=12&&used[nextx][nexty]==0&&map[nextx][nexty]==0){ 62 x.push(nextx); 63 y.push(nexty); 64 used[nextx][nexty]=1; 65 step[nextx][nexty]=step[prex][prey]+1; 66 } 67 } 68 } 69 return 0; 70 }