勝利大逃亡(續)
time limit:2000msmemory limit:32768kb64bit io format:%i64d & %i64u
submit
status
practice
hdu 1429
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 解體思路:地圖是n*m的,在這裡wa了好多次,竟然看成是n*n的了。首先一共有10種不同的鑰匙,每一種鑰匙只有兩種狀態,那麼可以用二進位制表示。1000表示有第4把鑰匙(3+『a'),1表示有第1把鑰匙(』a『),110表示有第二把和第三把鑰匙。那麼要判斷當前的鑰匙串有沒有能開啟當前門鑰匙,那麼就只要乙個&運算就可以,新增一把鑰匙,只要|運算就可以了。
**如下:
#include#include#includeusing namespace std;
int n,m,t;
char map[25][25];
int vist[25][25][1025];
int dis[4][2]=,,,};
struct stu
};stu s;
int bfs()
}else if(map[temp.x][temp.y]>='a'&&map[temp.x][temp.y]<='j')
}else }}
} }return -1;
}int main()
}} s.k=s.v=0;
memset(vist,0,sizeof(vist));
vist[s.x][s.y][s.k]=1;
printf("%d\n",bfs());
} return 0;
}
二進位制壓縮 演算法
二進位制壓縮 在程式設計時遇到每個資料只有兩種狀態,且 dfs 或者 bfs 時遍歷時間複雜度高時,可以採用二進位制壓縮資料,尤其是二維陣列。1.二進位制壓縮乙個二位陣列 例如 正常儲存資料回使用二位陣列,1,0,即 0100 0000 0000 0100如果我們採用二進位制壓縮為乙個 int 型別...
二進位制狀態壓縮
二進位制狀態壓縮,即將乙個長度為m的bool陣列用乙個m位的二進位制數來表示和儲存 操作運算 取出整數n在二進位制表示下的第k位 n k 1 取出整數n在二進位制表示下的第0 k 1位 後 k 位 n 1 取出整數n在二進位制表示下的第k位取反 n xor 1 取出整數n在二進位制表示下的第k位賦值...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...