Poj 3279Fliptile 二進位制列舉)

2021-10-06 04:45:32 字數 1365 閱讀 8059

題目傳送門

題意:給定0,1矩陣,每次反轉乙個位置,它相鄰的四個位置也會反轉(如果存在的話),反轉的意思就是1->0或者1->0,問最少反轉多少個位置就可以使矩陣全部變成0。最後輸出乙個矩陣,所有反轉的位置輸出1,否則輸出0,若存在多個答案相同,則輸出矩陣字典序最小的乙個。

先從第一行開始反轉,利用二進位制進行列舉,列舉第一行所有的可能選擇,當第一行反轉的確定了之後,後面每一行都隨之確定了,第二行開始逐個元素進行判斷,若該元素同一列的上乙個元素為1,那麼反轉當前元素,最後全部列舉之後,只有最後一行可能有1,判斷一下即可。

二進位制列舉的過程就保證了字典序小的在前。

code:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define io                       \

ios::sync_with_stdio(false); \

// cin.tie(0); \

// cout.tie(0);

using namespace std;

typedef long long ll;

const int maxn = 1e5 + 10;

const int maxm = 1e6 + 10;

const ll inf = 0x3f3f3f3f3f3f3f3f;

const int inf = 0x3f3f3f3f;

const ll mod = 11092019;

int dis[8][2] = ;

int a[20][20];

int b[20][20];

int temp[20][20];

int ans[20][20];

int res = inf;

int n, m;

void filp(int x, int y)

}int rep()

for (int i = 1; i < n; i++)

for (int j = 0; j < m; j++)

if (b[i - 1][j])

for (int j = 0; j < m; j++)

if (b[n - 1][j] == 1)

return inf;

return cnt;

}int main()

}if (res == inf)

cout << "impossible";

else

}return 0;

}

poj 3279 Fliptile 列舉 模擬

簡要題意 踩乙個點翻轉周圍五個點,求全翻成白色的方案中殘磚次數最少而且字典序最小的。我們可以首先確定第一行的翻轉情況,這個用二進位制列舉。然後之後每一行的翻轉情況就已經可以確定了,然後模擬出來就可以了。算是比較經典的題,好像看到過不少類似的題。include include include incl...

POJ3279 Fliptile 開關問題

記錄乙個菜逼的成長。挑戰程式設計書上的 pragma comment linker,stack 1024000000,1024000000 include include include include include include include include include include ...

反轉問題 POJ 3279 Fliptile

problem description 農夫約翰直到聰明的牛產奶多。於是為了提高牛的至上他準備了如下遊戲。有乙個n m的格仔,每個格仔可以翻轉正反面,它們一面是黑色,另一面是白色。黑色的格仔翻轉後就是白色,白色的格仔翻轉過來則是黒色。遊戲要做的就是把所有的格仔都翻轉成白色。不過因為牛蹄很大,所以每次...