HDU1253 勝利大逃亡

2021-12-29 21:04:08 字數 1484 閱讀 6986

這個問題一看,可以說和uva532 dungeon master完全相同,豪情萬丈地做了拷貝來程式修改,一提交結果是「time limit exceeded」,滿臉困惑。多方調查研究後,終於懂得了程式簡潔才是硬道理。也許因為測試資料量大,各個方面改進速度的措施都用了之後,總算是ac了。勝利大逃亡,逃出來了!

問題鏈結:hdu1253 勝利大逃亡。

題意簡述:三維城堡(迷宮),每個點由0(可以經過)和1(牆)組成。輸入測試用例數,輸入每個例子的立體長寬高和限定的時間,起點是<1,1,1>,終點是長,寬l,移動方向有上、下、左、右、前和後6個方向。每移動一次耗費1分鐘,問能否在限定時間內最快走出。如果能則輸出最短時間,不能則輸出-1。

問題分析:乙個三維迷宮,典型的bfs問題。在bfs搜尋過程中,走過的點就不必再走了,因為這次再走下去不可能比上次的步數少。

程式中,增加了邊界使得判定條件變得簡單;0和1的值對換了一下,判定條件也簡單了;限定時間條件也用上了,可以減少展開的節點數量。這個程式需要處處節省時間。

把沒有ac的程式也放在這裡,可以看出邏輯上沒有多少不同,就是不夠簡潔,結果是超時。

ac的c++語言程式如下:

/* hdu1253 勝利大逃亡 */

#include

#include

#include

#include

using namespace std;

const int directsize = 6;

struct direct direct[directsize] =

, , , , , };

const int maxn = 50;

int cube[maxn+2][maxn+2][maxn+2];

struct node ;

int l, r, c, limit;

node start;

int bfs()

direct[directsize] =

, , , , , };

const int maxn = 50;

int cube[maxn][maxn][maxn];

struct node ;

int l, r, c, limit;

node start, e2;

int ans;

void bfs()

else if(front.level < limit && cube[nextx][nexty][nextz] == 0)

if(ans > 0)

break;}}

}int main()

{ int t, i, j, k;

scanf("%d", &t);

while(t--) {

scanf("%d%d%d%d", &l, &r, &c, &limit);

for(i=0; i

hdu 1253 勝利大逃亡

先前在次處漏掉了,could come的判斷,結果一直wa。if step t could come include include struct q 150000 int head,tail,step,add step flag int input 52 52 52 int end x,end y...

HDU 1253 勝利大逃亡

這個題比較坑的bfs吧,注意如果判邊界的話可能會超時,最好先人為加邊界,然後進行搜尋,搜尋最好是隊尾判斷,因為可能出現起點和終點相同的資料 wa了很久 include include includeusing namespace std const int maxn 52 struct node q...

HDU 1253 勝利大逃亡

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