poj3279 子集列舉 狀態壓縮暴力

2021-08-14 17:48:19 字數 810 閱讀 1524

題意:給你乙個n*m的棋盤,有的棋子正面向上(0),有的棋子反面向上(1),問最少需要多少遍才能把所有的棋子變成正面向上?按字典序輸出每個位置翻轉的次數。

這題剛開始想的時候,是想著dfs的,畢竟出現在dfs的專題裡面,原本的想法是記錄下為1的位置,那麼翻肯定就要在它們的附近翻,然後遍歷所有的翻法,可是在寫的過程發現,這種寫法最後很難判斷是否存在解,而且複雜度也很高。後來看了看大神的**,恍然大悟。

思路:對於乙個棋子,只有兩種情況,正面向上和反面向上,並且操作兩次的會回到初始狀態,所以,對於每乙個位置的棋子最多隻需要操作一次。接著就是關鍵了:因為如果直接暴力列舉棋盤的所有情況需要2^(m*n),這很明顯會tle,於是我們只列舉第一行的所有情況。

具體操作:1、利用二進位制子集列舉第一行n個位置的所有情況。對應位置如果是·1則反轉對應位置。

2、對於2...m行,如果上行圖對應的位置為1則對其下一行對應位置反轉。(翻過的不翻,防止重複,所以能影響到的只有下一行)

3、最後判斷一下最後一行是否能達到全面正面朝上,如果可以比較得出最短的步驟。

嗯...最後學習了memcpy來複製陣列!

#include#include#include#define inf 0x3f3f3f3f

using namespace std;

int m,n;

int maze[50][50],cntmaze[50][50],temp[50][50],cnt,mins,minmaze[50][50];

int dx=,dy=;

bool ok()

for(int i=1;i>m)

}for(int i=0;i<(1<

POJ 3279 搜尋(反轉)

這道題搜尋的角度很有意思。比較直白的想就是每個瓷磚都可以反或不反,2種選擇。這樣的話,搜尋的狀態數時間太多,指數級增長,肯定t。不妨這麼想。如果指定了第1橫排的翻法。那麼如果第1橫排存在黑色,也就是 1,x 為黑。那麼 2,x 就必須反轉才能保證 1,x 為白,那麼第2排的反轉法也確定了。如此類推,...

POJ3279 開關後續

描述 乙個n m 的矩陣,每個格仔 有0和1 兩種狀態 每次可 以翻乙個 格仔,並 且此格仔 的上下左 右都要被 翻。n m的矩陣,每個格仔有0和1兩種狀態.每次可以翻乙個格仔,並且此格仔的上下左右都要被翻。n m的矩陣 每個格 子有0和 1兩種狀 態.每次 可以翻一 個格仔,並且此格 子的上下 左...

poj3279 (搜尋,好題 )

前題 這題是之前 做鄺斌搜尋專題遺留下的三題之一,最近為了複習搜尋姿勢補上。題意 最大15 15平面 二維陣列 有1有0,對乙個地方操作,與他相鄰四個包括他自己會翻轉 0變1,1變0 求出最少的操作讓全部變成0,輸出操作位置圖。思路 很明顯每個點操作一次就夠了,兩次恢復原樣,然後 我就想不到了.15...