7-1 迷宮尋路 (20分)給定乙個m行n列的迷宮圖,其中 "0"表示可通路,「1"表示障礙物,無法通行。在迷宮中只允許在水平或上下四個方向的通路上行走,走過的位置不能重複走。
5行8列的迷宮如下:
0 1 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 0 0 0 0 0 0 0
則從左上角(1,1)至右下角(5,8)的最短路徑為:
1,1–》2,1–》2,2–》2,3–》3,3–》3,4–》3,5–》4,5–》5,5–》5,6–》5,7–》5,8
題目保證每個迷宮最多只有一條最短路徑。
請輸出該條最短路徑,如果不存在任何通路,則輸出"no found」.
輸入格式:
第一行,輸入m和n值,表示迷宮行數和列數。
接著輸入m行數值,其中,0表示通路,1表示障礙物。每列數值用空格符間隔。
接下來可能輸入多組迷宮資料。
當輸入m的值為-1時結束輸入。
輸出格式:
按行順序輸出路徑的每個位置的行數和列數,如 x,y
如果不存在任何路徑,則輸出"no found".
每組迷宮尋路結果用換行符間隔。
輸入樣例:
在這裡給出一組迷宮。例如:
8 8
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 1 1 1 0 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 0
0 1 1 1 0 1 1 0
1 0 0 0 0 0 0 0
4 4
0 0 1 0
0 0 0 0
0 0 1 1
0 1 0 0
-1 -1
輸出樣例:
在這裡給出相應的輸出。例如:
1,12,1
3,14,1
5,15,2
5,36,3
6,46,5
7,58,5
8,68,7
8,8no found
#
include
#include
using
namespace std;
struct
position
pos[4]
;//四個方向的變數
intmain()
//每個一級指標又可以指向乙個一維陣列,構成了乙個可以動態宣告大小的二維陣列
for(
int i =
1; i <= row; i++)}
for(
int i =
0; i < col+
2; i++
)for
(int i =
0; i < row+
2; i++
)//四個行走方向
pos[0]
.x =
0; pos[0]
.y =1;
// 上
pos[1]
.x =
1; pos[1]
.y =0;
// 右
pos[2]
.x =
0; pos[2]
.y =-1
;// 下
pos[3]
.x =-1
; pos[3]
.y =0;
// 左
//分別是起點,中途經過的點,終點
position start, nbr, end;
start.x =
1; start.y =1;
//起始點
end.x = row; end.y = col;
//出口
/*以下do語句塊中的目的:標記迷宮,我們規定,
對於迷宮的每乙個座標,
用乙個數字對其進行標識,
這個數字為該點到達起始點的距離
*/maze[1]
[1]=
2;/*因為圍牆處的值為1,
為了區分,
設初始點(1,1)值為2,
意味著如果maze[座標x][座標y]的取值4,
那麼該點距離起點的距離為4-2=2;
*///核心方法:廣度優先遍歷。
queuepath;
//用乙個佇列儲存可能可以繼續走的點
do path.
push
(nbr)
;//如果不是終點的話,那麼先把它暫時放進乙個佇列中,因為我們一會可以再以這個點為起點繼續往前走,繼續標識}}
//for迴圈結束了,表示以某乙個點為起點的四個方向你都已經嘗試過了
//即這個點周圍的點你都標識了
if(nbr.x == end.x && nbr.y == end.y)
if(path.
empty()
)else
}while
(true);
//標識結束
if(nbr.x == end.x && nbr.y == end.y)
} start = nbr;
} cout <<
"1,1"
<< endl;
for(
int i =
0; i < length; i++
) cout << endl;}}
return0;
}
PTA7 1 迷宮尋路 20分
7 1 迷宮尋路 20分 給定乙個m行n列的迷宮圖,其中 0 表示可通路,1 表示障礙物,無法通行。在迷宮中只允許在水平或上下四個方向的通路上行走,走過的位置不能重複走。5行8列的迷宮如下 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1...
C 實現A 尋路
網上有關a 演算法的文章已經非常豐富了,各種語言各種思路都有,本來我實在不想再寫一篇,但因為最近工作動盪因此專門抽空又看了一下,然後就想寫個文章防止以後印象模糊,好歹看自己寫的東西可以很快回憶起來。如果是初次接觸a 演算法的朋友可以先看看這篇參考文章,我這邊只是做乙個總結,然後先貼上我之前的筆記吧 ...
C 實現網路尋路
x 國的乙個網路使用若干條線路連線若干個節點。節點間的通訊是雙向的。某重要資料報,為了安全起見,必須恰好被 兩次到達目的地。該包可能在任意乙個節點產生,我們需要知道該網路中一共有多少種不同的 路徑。源位址和目標位址可以相同,但中間節點必須不同。如圖1所示的網路。1 2 3 1 是允許的 1 2 1 ...