POJ 開關問題

2022-09-21 15:12:08 字數 1411 閱讀 9904

挑戰p153

題意:有乙個m*n的格仔,每個格仔有兩種顏色,每個格仔可以翻轉,每翻轉乙個格仔它以及其上下左右四個格仔都會變為它相反的狀態,問最少反轉哪些格仔可以把這些格仔都變成相同的狀態,解有多個時,輸出字典序最小的乙個

經典的開關問題,只要第一行的狀態確定其他行的狀態也將確定,故暴力列舉第一行的開關情況,判斷最後一行的狀態是否符合題意,複雜度$o(mn

2^n)$,直接貼原**

#include#include#includeusing namespace std;

const int dx[5]=;

const int dy[5]=;

int m,n,tile[16][16],opt[16][16],flip[16][16];

int get(int x,int y)

}if(res<0)

printf("impossible\n");

else for(int i=0;i

題意:有20個碗依次排列,有的碗口朝上,有的碗口朝下,牛希望所有的碗口都能朝上,每次翻動某個碗時,他左邊和右邊的碗也會翻轉到相反的狀態,問要想將這些碗碗口都朝上,至少要翻動多少次。

首先沒每個碗最多翻動一次,否則重複,而且碗先翻與否不影響結果,故可以貪心法從頭到尾考慮每乙個碗,對於沒個碗,如果左邊的碗朝上,則它不能翻動,反之則需要翻動,對第乙個碗分翻與不翻兩種情況考慮,判斷最後乙個碗是否朝上且取較小的值即可。

#include#include#includeusing namespace std;

int main()

a[1]=!a[1];

a[2]=!a[2];

for(int i=2;i<=20;i++)

}for(int i=2;i<=20;i++)

}cout<

題意:有乙個5*6的格仔,每個格仔有兩種顏色,每個格仔可以翻轉,每翻轉乙個格仔它以及其上下左右四個格仔都會變為它相反的狀態,問最少反轉哪些格仔可以把這些格仔都變成相同的狀態,解有多個時,輸出字典序最小的乙個

經典的開關問題,只要第一行的狀態確定其他行的狀態也將確定,故暴力列舉第一行的開關情況,判斷最後一行的狀態是否符合題意

#include#include#includeusing namespace std;

const int dx[5]=;

const int dy[5]=;

int m,n,tile[16][16],opt[16][16],flip[16][16];

int get(int x,int y)

}cout<<"puzzle #"

printf("impossible\n");

else for(int i=0;ifor(int j=0;jprintf("%d%c",opt[i][j],j+1==n? '\n':' ');

}}

POJ1830 開關問題

中文題目,就不說題目大意了 解題思路 由於對於每乙個開關最多改變一次,那麼對於每乙個開關,只有改變與不改變兩種操作,設改變操作為1,不改變操作為0,那麼對開關的操作可以用乙個n維向量x t x 1,x2 x n 其中xi 0或者 1 我們需要知道初始狀態經過某次操作之後的狀態,並拿它與目標狀態比較。...

開關問題 POJ 1830

題意 燈泡對應開關,有些開關的撥動會影響其他的開關,給出燈泡初始狀態,給出燈泡結束狀態,問有幾種操作可以完成 思路 建立矩陣,消元後有n個自由變元,答案就是2 n個 include include include includeusing namespace std const int maxn 5...

poj3276(開關問題)

可算明白了.bbfbfbb 我們到達第三個f,我們需反轉。標記一下在3出反轉了 vis 3 1 對以後的影響是 1.用sum記載影響程度即sum 1 我們到達第四個,雖然是b,但是收到前面影響 sum 1 也就是變成f了。我們需要反轉。標記vis 4 1.sum再 1.即sum 2 也就是第五個會受...