定義乙個二維陣列:
int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
input
乙個5 × 5的二維陣列,表示乙個迷宮。資料保證有唯一解。
output
左上角到右下角的最短路徑,格式如樣例所示。
sample input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
sample output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
bfs(廣度優先搜尋演算法):
廣度優先搜尋的優點是找出的第一條路徑就是最短路徑,常用來搜尋最短路徑。可以想象從入口處灌水,通過水的漫布進行層次式的搜尋,一旦達到終點,停止搜尋。可借助佇列和樹實現。
實現步驟:
(1)從入口元素開始,判斷它上下左右的鄰邊元素是否滿足條件,如果滿足條件就入佇列;
(2)取隊首元素並出佇列。尋找其相鄰未被訪問的元素,將其如佇列並標記元素的前驅節點為隊首元素。
(3)重複步驟(2),直到隊列為空(沒有找到可行路徑)或者找到了終點。最後從終點開始,根據節點的前驅節點找出一條最短的可行路徑。
**:
#include
#include
#include
#include
using
namespace std;
struct node };
int f[4]
[2]=
;// 定義四個方向
node maze[5]
[5];
// 迷宮
int head =0;
// 用於建立樹
queue q;
vector qs;
// 滿足條件的新點加入佇列
void
work
(const node &n)
node &e = maze[nx]
[ny];if
(e.flag ==0)
}}void
print_s
(node a)
//實現路徑輸出的函式(遞迴)
else
}int
main()
}// bfs(廣度優先搜尋): 使用佇列
maze[0]
[0].flag =1;
// 第乙個點特殊,flag初始為1
q.push
(maze[0]
[0])
; node q_fro = q.
front()
;while
(q_fro.x !=
4|| q_fro.y !=4)
print_s
(qs.
back()
);}
ACM 迷宮問題
使用dfs的方法對所有路徑進行遍歷,當某路徑可以到達終點時,使用乙個向量儲存路徑,並使用乙個陣列儲存他的路徑長度,最後輸出路徑最短的路徑。include include include using namespace std int m,n int vis 5 5 int f 4 2 左,上,右,下...
逃離ACM迷宮(BFS)
題目鏈結 題目描述 如下圖所示的是乙個由程式設計題目組成的acm迷宮。迷宮的左上角是入口,右下角是出口。迷宮中每乙個格仔都有乙個程式設計題目,挑戰者要ac該題目後才能通過,大於0的數字表示ac該題目所需的最短時間。數字如果是0表示是陷阱,進去了就出不來。現在的問題是 求挑戰者從入口到出口所需的最短時...
ACM 演算法3 3 迷宮 程式
題目描述 有乙個 10 x 10 的迷宮,起點是 s 終點是 e 牆是 道路是空格。乙個機械人從起點走到終點。當機械人走到乙個通道塊,前面已經沒有路可走時,它會轉向到當前面向的右手方向繼續走。如果機械人能夠過,則留下足跡 如果走不通,則留下標記 下面給出書中的演算法,請你模擬機械人的走法輸出最終的狀...