挑戰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 也就是第五個會受...