本作品採用知識共享署名-相同方式共享 4.0 國際許可協議進行許可。
有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。
你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。
對於任意乙個開關,最多只能進行一次開關操作。
你的任務是,計算有多少種可以達到指定狀態的方法。(不計開關操作的順序)
輸入格式
輸入第一行有乙個數k,表示以下有k組測試資料。
每組測試資料的格式如下:
第一行 乙個數n(0 < n < 29)。
第二行 n個0或者1的數,表示開始時n個開關狀態。
第三行 n個0或者1的數,表示操作結束後n個開關的狀態。
接下來 每行兩個數i j,表示如果操作第 i 個開關,第j個開關的狀態也會變化。
每組資料以 0 0 結束。
輸出格式
如果有可行方法,輸出總數,否則輸出「oh,it』s impossible~!!」 。
輸入樣例:23
0 0 0
1 1 1
1 21 3
2 12 3
3 13 2
0 03
0 0 0
1 0 1
1 22 1
0 0輸出樣例:
4oh,it』s impossible~!!
分析:漲姿勢的一道題。同時,認真耐心,不懼怕的去看題,看題解,至關重要。不要害怕。
日後必當更加勉勵。
參考部落格:
這篇部落格的思路還是很不錯的。建議看下。
下面我說下我對這個題的理解:
題目給出的條件:
1,每個開關至多一次操作。
2,操作i開關會改變j開關的狀態。
開關至多操作一次,那麼我是否可以用乙個陣列x。來表示開關的操作情況呢。
即 x[i] == 1 則表示第i號開關我是按了一次的。x[i] == 0 則表示第i號開關沒有按。
操作i開關會改變j開關的狀態,那麼我是否可以用乙個二維陣列a來把這個改變情況儲存下來呢。a[i][j] == 1 則表示操作j號開關,會改變i號開關。a[i][j] == 0 則表示不會改變。特殊的,我們需要令a[i][i] == 1(一開始忘了,導致樣例都沒過)。
我們在把開關的初始狀態的放入start陣列,最終狀態放入end陣列。
我們令開關開時狀態為1.關是狀態為0.
我們清楚的知道,每次按一下i號開關,所產生的影響無非就是對i號及其相關的開關產生影響。影響情況應為1變0.0變1.這不就是異或的性質了木。
1^1 == 0
1 ^0 == 1.
上面兩個式子中的第乙個1表示a陣列裡面的1.第二個數字表示開關的狀態,結果值為開關狀態。
那麼我們可以得到下面方程組:
start[i] ^ a[i][1] * x[1] ^ a[i][2] * x[2] ~~ x[i][n] * x[n] == end[i]。
轉化得:
a[i][1] * x[1] ^ a[i][2] * x[2] ~~ x[i][n] * x[n] == end[i] ^ start[i] 。
簡單分析一下第乙個式子。就是第i號開關的開始狀態異或所有能改變第i號開關的操作,當然,像a[i][j]==1了,那麼x[j] == 1.這個改變才能成立。所以a[i][j] * x[j]。
下面code使用了位運算來壓縮
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
int t,n;
int a[32];
int main()
while(1)
int ans = 1;
for(int i = 1; i <= n; i ++)
if(a[i] == 1)
if(a[i] == 0)
for(int j = n; j >= 1; j --)
}break;}}
}if(ans == 0) else }}
poj 1830 異或方程組
題意 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開關,最多只能進行一次開...
poj1830開關問題 異或高斯消元
題目 根據題意,構造出n元方程組 a 1,1 x1 a 1,2 x2 a 1,3 x3 a 1,n xn st1 ed1 a 2,1 x1 st2 ed2 其中a x,y 表示x是否受到y影響 x為各燈是否操作 stx為x初始狀態,edx為x目標狀態 把乙個方程壓縮成乙個整數,第1位表示等號右邊,之...
POJ1830 開關問題 高斯消元 異或
設xixi表示第ii個開關的操作情況,那麼xi 1xi 1為按了這個開關,否則xi 0xi 0表示這個開關並沒有按下去,那麼我們接著統計ai,jai,j表示第i個開關和第j個開關的聯絡情況,ai,j 1ai,j 1表示按下j會影響i的狀態,否則就是不會影響,即ai,j 0ai,j 0,特殊地乙個點就...