反轉問題 POJ 3279 Fliptile

2021-08-13 20:50:21 字數 1244 閱讀 1345

problem description

農夫約翰直到聰明的牛產奶多。於是為了提高牛的至上他準備了如下遊戲。有乙個n*m的格仔,每個格仔可以翻轉正反面,它們一面是黑色,另一面是白色。黑色的格仔翻轉後就是白色,白色的格仔翻轉過來則是黒色。遊戲要做的就是把所有的格仔都翻轉成白色。不過因為牛蹄很大,所以每次翻轉乙個格仔時,與它上下左右相鄰接的格仔也會被翻轉。因為翻格仔太麻煩了,所以牛都想通過盡可能少的次數把所有格仔都翻成白色。現在給定了每個格仔的顏色,請求出用最小步數完成時每個格仔翻轉的次數。最小步數的解有多個時,輸出字典序最小的一組。解不存在的話,則輸出impossible。

思路:

反轉問題核心的點:首先,同乙個格仔翻轉兩次的話就會恢復原狀,所以多次翻轉是多餘的。此外,翻轉的格仔的集合相同的話,其順序是無關緊要的。

因為m的範圍很小,所以我們可以列舉一行的所有情況,進行翻轉。

第一行確定其翻轉方式後,其餘的就簡單了。

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int a[18][18], b[18][18], vis[18][18], ans[18][18];

int xx[5] = ;//翻轉的時候五個位置

int yy[5] = ;

int n, m, cnt, sum;

void fanz(int x, int y)//翻轉

}int judge(int en)//判斷en這行,是否全是0

return1;}

void f(int s)

}for(i = 1; i < n; i++)//遇到沒有翻轉的對其進行翻轉}}

if(judge(n - 1) && cnt < sum)//更新最小的次數

}int main()

}//第一行所有的情況一共有1<< m); i++)

if(sum == inf) printf("impossible\n");

else

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

printf("\n");}}

return

0;}

POJ 3279 搜尋(反轉)

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

POJ3279反轉 位運算

題意 要用最少的步驟將題目所給的矩陣中的所有1都變為0,已知每次反轉乙個點時,其周圍與其有公共邊的格仔都會反轉。做法 有條理的做,想要全部反轉,首先要從區域性開始,例如,先把第一行全部變為0,若第一行有n列,那麼相應的對第一行的操作一共就有2 n種,每一種方法不一定都能將第一行全部置為0,更有可能沒...

POJ3279 Fliptile 開關問題

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