時間限制: 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。
33 3 2
......
...1 1
1 32 2
3 3 1
....#.
...1 1
3 32 3 1
..#.#.
1 12 3
33-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 起點 ...