ACM 迷宮問題

2021-10-02 18:49:33 字數 1705 閱讀 9465

定義乙個二維陣列:

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 牆是 道路是空格。乙個機械人從起點走到終點。當機械人走到乙個通道塊,前面已經沒有路可走時,它會轉向到當前面向的右手方向繼續走。如果機械人能夠過,則留下足跡 如果走不通,則留下標記 下面給出書中的演算法,請你模擬機械人的走法輸出最終的狀...