HDU 1429 勝利大逃亡 續

2021-07-07 06:08:27 字數 2140 閱讀 1897

a - 勝利大逃亡(續)

time limit:2000msmemory limit:32768kb64bit io format:%i64d & %i64u

submit

status

practice

hdu 1429

system crawler  (2015-11-09)

description

ignatius再次被魔王抓走了(搞不懂他咋這麼討魔王喜歡)…… 

這次魔王汲取了上次的教訓,把ignatius關在乙個n*m的地牢裡,並在地牢的某些地方安裝了帶鎖的門,鑰匙藏在地牢另外的某些地方。剛開始ignatius被關在(sx,sy)的位置,離開地牢的門在(ex,ey)的位置。ignatius每分鐘只能從乙個座標走到相鄰四個座標中的其中乙個。魔王每t分鐘回地牢視察一次,若發現ignatius不在原位置便把他拎回去。經過若干次的嘗試,ignatius已畫出整個地牢的地圖。現在請你幫他計算能否再次成功逃亡。只要在魔王下次視察之前走到出口就算離開地牢,如果魔王回來的時候剛好走到出口或還未到出口都算逃亡失敗。 

input

每組測試資料的第一行有三個整數n,m,t(2<=n,m<=20,t>0)。接下來的n行m列為地牢的地圖,其中包括: 

. 代表路 

* 代表牆 

@ 代表ignatius的起始位置 

^ 代表地牢的出口 

a-j 代表帶鎖的門,對應的鑰匙分別為a-j 

a-j 代表鑰匙,對應的門分別為a-j 

每組測試資料之間有乙個空行。 

output

針對每組測試資料,如果可以成功逃亡,請輸出需要多少分鐘才能離開,如果不能則輸出-1。 

sample input

4 5 17

@a.b.

a*.*.

*..*^

c..b*

4 5 16

@a.b.

a*.*.

*..*^

c..b*

sample output

16

-1

思路:

這題一開始認為是直接求出鑰匙與門之間的距離就能人走到門那裡直接加剛剛求出的距離,就ok了。結果寫好才發現根本思路是錯的,而且**非常複雜,兩個結構體,3,4個函式。最後看了看題解,都說是增加鑰匙狀態去當標記,這樣就能走重複過的x,y了,巧妙。最後wa了兩次,因為不記得比較第幾把鑰匙wa了。

總結:之前是想用容器去將鑰匙的情況的儲存起來結果發現複雜度太高了,而且不能保證能全部遍歷一次, 所以做了這題後,我發現其實增加維數在搜尋裡就是一種暴力求解的工具。

ac**:

#include#include#include#include#include#include#includeusing namespace std;

#define t 1000005

int n,m,t;

char str[30][30];

bool vis[30][30][1<<11];

int fx[2] = ,,,};

bool jugde(int x,int y,int& key)

else if(str[x][y]=='.'||str[x][y]>='a'&&str[x][y]<='z'&&((key>>(str[x][y]-'a'))&1))

return true;

else if(str[x][y]=='@')

} return false;

}struct point

point(){}

}p[t],q;

int bfs(int x,int y,int xx,int yy)

int key1 = key;

if(jugde(tx,ty,key))

} }return -1;

}void init()

int main()

if(str[i][k]=='^')

}} int tmp = bfs(x,y,xn,yn);

if(tmpelse

}return 0;

}

HDU1429 勝利大逃亡 續

學習位壓縮很好的一道題,因為只有10把鑰匙,那麼可以把10鑰匙壓縮二進位制,比如1000就表示身上只要第4把鑰匙的狀態,110表示帶有第2把和第3把鑰匙,那麼要判斷當前的鑰匙串有沒有能開啟當前門鑰匙,那麼就只要乙個 運算就可以,因為11101110 00100000 00100000 這樣就說明那一...

hdu 1429 勝利大逃亡 續

code include include using namespace std struct px struct px start char map 25 25 int mark 25 25 1025 dir 4 2 三維表,走過的路徑對應表的狀態 int wys 10 int n,m,t boo...

hdu 1429勝利大逃亡 續

題目 一開始想了好幾種方法。最後實驗都錯了。要麼是就是演算法思想錯誤。然後以為可以這樣。果斷。記憶體超出。下面是錯誤 include include includeusing namespace std define n 21 int n,m,t char map n n bool visited ...