1726 迷宮(BFS(有坑點))

2022-07-29 16:18:18 字數 2472 閱讀 3463

時間限制: 1 sec  記憶體限制: 128 mb

提交: 1043  解決: 155

[提交][狀態][討論版][命題人:admin]在很多 rpg (role-playing games) 遊戲中,迷宮往往是非常複雜的遊戲環節。通常來說,我們在走迷宮的時候都需要花非常多的時間來嘗試不同的路徑。但如果有了演算法和計算機的幫助,我們能不能有更快的方式來解決這個問題?我們可以進行一些嘗試。

現在我們有乙個 n 行 m 列的迷宮。迷宮的每個格仔如果是空地則可以站人,如果是障礙則不行。在乙個格仔上,我們可以一步移動到它相鄰的 8 個空地上,但不能離開地圖的邊界或者跨過兩個障礙的夾縫。下圖是乙個移動規則的示例。

為了離開迷宮,我們還需要觸發迷宮中所有的機關。迷宮裡總共有 k 個機關,每個機關都落在乙個不同的空地上。如果我們到達了某個機關所在的格仔時,這個機關就會被自動觸發,並在觸發之後立即消失。我們的目標是按順序觸發所有的 k             個機關,而當最後乙個機關被觸發時,我們就可以離開迷宮了。

現在我們已經拿到了迷宮地圖,並且知道所有障礙、機關的位置。初始時我們位於迷宮的某個非障礙格仔上,請你計算我們最少需要移動多少步才能離開迷宮?

輸入的第一行是測試資料的組數 t (t ≤ 20)。

對於每組測試資料:第一行包含地圖的行數 n (2 ≤ n  ≤ 100),列數 m(2 ≤ m  ≤ 100) 和機關的數量 k(1 ≤ k ≤10)。接下來 n 行,每行包含 m 個字元,其中字元 『#』 表示障礙,而 『.』 表示空地。接下來一行描述了我們的初始位置 (x, y),表示我們一開始在第 x 行第 y 列的格仔上。這個格仔保證是個空地。接下來 k 行,每行給出了乙個機關的位置。所有的機關都不會出現在障礙上,並且任意兩個機關不會出現在同乙個空地上。我們需要按輸入給定的順序觸發所有的 k 個機關。

對於每組測試資料,輸出離開迷宮所需要的最少步數。如果無論如何都不能離開迷宮,輸出 -1。

3

3 3 2

......

...1 1

1 32 2

3 3 1

....#.

...1 1

3 32 3 1

..#.#.

1 12 3

3

3-1

#include #include 

#include

using

namespace

std ;

#define maxn 110

intn , m , k ;

char

map[maxn][maxn] ;

bool

visit[maxn][maxn] ;

int dirx[8] = ;

int diry[8] = ;

bool

flag ;

intresult ;

struct

node ;

node trap[

20] ;

bool

check(node ch , node pre)

else

}else}}

return

false; }

void

bfs(node s , node e)

node turn ;

for(int i=0 ; i<8 ; i++)}}

//本次查詢未找到目的地

if(flag11 == false

) flag = false

;

return; }

intmain()

}intstartx , starty ;

cin >> startx >>starty ;

trap[

0].x = startx , trap[0].y =starty ;

/** 坑點:起點可以是陷阱位置,但是不可以是第乙個陷阱之後的陷阱

* 如果是第乙個陷阱之後的陷阱,會導致陷阱提前觸發

* 無法完成順序觸發陷阱的任務

*/for(int i=1 ; i<=k ; i++)

}//設定陷阱記號

for(int i=1 ; i<=k ; i++)

for(int i=1 ; i<=k ; i++)

node s , e ;

s.x = trap[i-1

].x ;

s.y = trap[i-1

].y ;

s.step = 0

; e.x =trap[i].x ;

e.y =trap[i].y ;

//取消陷阱標記

map[trap[i].x][trap[i].y] = '.'

;

bfs(s , e ) ;

}if(flag==false

)else

} return0;

}

迷宮問題bfs

迷宮問題 採用佇列的廣度優先遍歷 bfs 思想是從乙個頂點v0開始,輻射狀地優先遍歷其周圍較廣的區域 找到的解為最優解 include define m 8 define n 8 define maxsize 1000 typedef struct box typedef struct qutype...

迷宮問題BFS

the code 資料結構迷宮.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include define n 4 定義迷宮為4 4 using namespace std struct pot 為記錄路徑的rec準備,座標 x...

迷宮問題bfs

小明置身於乙個迷宮,請你幫小明找出從起點到終點的最短路程。小明只能向上下左右四個方向移動。輸入包含多組測試資料。輸入的第一行是乙個整數t,表示有t組測試資料。每組輸入的第一行是兩個整數n和m 1 n,m 100 接下來n行,每行輸入m個字元,每個字元表示迷宮中的乙個小方格。字元的含義如下 s 起點 ...