【題目鏈結】
給乙個n*m的矩陣,1代表黑色方塊,0代表白色方塊。現在乙隻牛要把全部方塊翻成白色,它一腳下去能把白變黑,黑變白。由於蹄子太大當它踩某格時候周圍上下左右都將根隨變換。問牛最少踩的次數的方案,如果有多種輸出字典序小的。無法則輸出 「impossible」
因為白的踩一變黑的,黑的踩一次變白的,所以每個格仔最多踩一次就可以了,多踩又變回去了。當第n行確定,為了保證第n行的1都變成0,第n+1行踩的位子只能是上行為1的位子。所以當第1行確定了整個圖踩的方案就確定了。只要判斷最後一行踩完後是否全為0,是則方案可行否則不可以行。列舉第一行全部的踩法找最優。
可以開二維陣列記圖,也可以用二進位制來表示。(n不大)具體看**吧
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define inf 0x3f3f3f3
const
int n = 1e5+5;
int mp[16];
int a[16]; //記錄踩完後的圖
int b[16]; //記錄最小方案
int c[16]; //記錄每層踩的位子
int mn;
int n,m;
void dfs(int i,int k,int ans) //行數;第i-1行的值,同樣數第i行需要踩的格仔;步數
return;
}a[i] ^= mp[i]; //拿兩個變數來記錄本行和下一行也可以
int s = 0;
for (int j = 1; j <= k;j <<= 1)
}dfs(i+1,a[i],ans+s);
}int main()
if (mn == inf)
printf("impossible\n");
else
for (int i =0; i < n; i++)}}
return
0;}
/*4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
1 40 1 1 1
2 40 0 1 1
0 0 1 1
*/
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的格仔,每個格仔可以翻轉正反面,它們一面是黑色,另一面是白色。黑色的格仔翻轉後就是白色,白色的格仔翻轉過來則是黒色。遊戲要做的就是把所有的格仔都翻轉成白色。不過因為牛蹄很大,所以每次...