hdu 1429(好題 二進位制壓縮)

2021-07-10 23:50:20 字數 1741 閱讀 5529

勝利大逃亡(續)

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年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...