hdu4845 狀態壓縮BFS

2021-06-23 03:56:59 字數 1669 閱讀 1386

題意:

給乙個n*m的矩陣,從11,走到nm,格仔和格仔之間可能有牆,也可能有門,有的格仔上面有鑰匙,相應的鑰匙開相應的們,撿鑰匙和開門都不需要時間,問你最少多少部能走到nm.

思路:

哎!一眼就看出來了是個狀態壓縮搜尋的水題,結果wa了將近兩個小時,就是因為忽略了乙個點可能有多把鑰匙,回來說下這個題,我們可以開乙個陣列mark[x][y][key],表示當前的這個點xy所含有的鑰匙狀態是key的時候是否走過,key是乙個二進位制壓縮的數,這個很簡單不解釋,同時在開乙個陣列bnk[x1][y1][x2][y2]記錄從x1y1到點x2y2的中間是什麼東西(牆,門,或者什麼都沒有),然後就是遍歷就行了,題目一點不難,還不明白的直接看**就知道了。

#include#include#include#define n 20

using namespacestd;

typedef struct

node;node xin,tou;

intmark[n][n][1<<10+1];

intbank[n][n][n][n];

intmap[n][n];

intdir[4][2] = ;

intbfs(

intn,

intm)}}

}return

-1;

}int

main

()scanf("%d",&q);memset(map,0,

sizeof

(map));

for(i=1;i<=q;i++)

printf("%d\n",bfs(n,m));

}return0;

}

hdu 2209 BFS 狀態壓縮

這題bfs是比較簡單,但是就是在狀態壓縮和那個翻牌的操作就蛋疼了。開始的時候暴力。華麗麗的超時了。最後看了別人的思路,才恍然大悟。這題 因為翻牌是0變1,1變0,所以可以通過異或來實現,而每一位的翻牌操作,只需要事前把用來異或的數算出來儲存就行,如下 handle 1 3 handle length...

hdu 5025 bfs 狀態壓縮

首先因為鑰匙是順序拿取的,所以記錄當前取到第幾把就可以 因為殺蛇是無序的,所以要用0 1二進位制數表示 然後寬搜就好了 wrong了一天就是讀入問題,默默反省 include include include include include include define max 107 using n...

hdu1429(bfs 狀態壓縮)

思路 有十個門,有十把鑰匙,每把鑰匙對應乙個門,相同的門可以有多個。這樣,我們就得按照狀態來搜尋,用0000000001代表第乙個門有鑰匙了,1000000000代表第十個門鑰匙有了.一次類推,可以用二進位制來表示.遇到鑰匙,可以先拾起這個鑰匙,用 遇到門,可以判斷是否有這個門的鑰匙,把門狀態位移後...