九度OJ 1456 勝利大逃亡

2021-07-27 10:51:56 字數 1390 閱讀 6950

本題是廣度優先搜尋的第一題。

本題先抽象出狀態,構造出狀態轉移關係,構造出解答樹,將搜尋路徑抓化為搜尋狀態,並利用結論進行剪枝優化解答樹,後利用廣度優先搜尋對狀態解答樹進行層次遍歷,找到最優解。

題目描述:ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,城堡是乙個a*b*c的立方體,可以被表示成a個b*c的矩陣,剛開始ignatius被關在(0,0,0)的位置,離開城堡的門在(a-1,b-1,c-1)的位置,現在知道魔王將在t分鐘後回到城堡,ignatius每分鐘能從乙個座標走到相鄰的六個座標中的其中乙個.現在給你城堡的地圖,請你計算出ignatius能否在魔王回來前離開城堡(只要走到出口就算離開城堡,如果走到出口的時候魔王剛好回來也算逃亡成功),如果可以請輸出需要多少分鐘才能離開,如果不能則輸出-1.

輸入:輸入資料的第一行是乙個正整數k,表明測試資料的數量.每組測試資料的第一行是四個正整數a,b,c和t(1<=a,b,c<=50,1<=t<=1000),它們分別代表城堡的大小和魔王回來的時間.然後是a塊輸入資料(先是第0塊,然後是第1塊,第2塊......),每塊輸入資料有b行,每行有c個正整數,代表迷宮的布局,其中0代表路,1代表牆。

輸出:對於每組測試資料,如果ignatius能夠在魔王回來前離開城堡,那麼請輸出他最少需要多少分鐘,否則輸出-1.

樣例輸入:

1

3 3 4 20

0 1 1 1

0 0 1 1

0 1 1 1

1 1 1 1

1 0 0 1

0 1 1 1

0 0 0 0

0 1 1 0

0 1 1 0

樣例輸出:

11

#include #include #define maxsize 50

using namespace std;

struct ans

ans(int x,int y,int z,int t)

};int main()

//initiate

while (!q.empty())

q.pop();

q.push(ans(0,0,0,0));

mark[0][0][0]=true;

find=false;

//search

while (!q.empty())

if (x+1=0&&!blocked[x][y-1][z]&&!mark[x][y-1][z])

if (y+1=0&&!blocked[x][y][z-1]&&!mark[x][y][z-1])

if (z+1

九度OJ題目1456 勝利大逃亡

題目描述 ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,城堡是乙個a b c的立方體,可以被表示成a個b c的矩陣,剛開始ignatius被關在 0,0,0 的位置,離開城堡的門在 a 1,b 1,c 1 的位置,現在知道魔王將在t分鐘後回...

九度 1456 《勝利大逃亡》

定義 map mark 佇列q 節點node int bfs 引數 return 結果不存在時的結果 初始化起點資訊 mark標記為true 處理起點資訊 入隊 九度 1456 bfs 迷宮類bfs include include define size 55 using namespace std...

九度 題目1456 勝利大逃亡

題目描述 ignatius被魔王抓走了,有一天魔王出差去了,這可是ignatius逃亡的好機會.魔王住在乙個城堡裡,城堡是乙個a b c的立方體,可以被表示成a個b c的矩陣,剛開始ignatius被關在 0,0,0 的位置,離開城堡的門在 a 1,b 1,c 1 的位置,現在知道魔王將在t分鐘後回...