這個問題一看,可以說和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...