題意:
給乙個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 20using 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代表第十個門鑰匙有了.一次類推,可以用二進位制來表示.遇到鑰匙,可以先拾起這個鑰匙,用 遇到門,可以判斷是否有這個門的鑰匙,把門狀態位移後...