POJ1830 開關問題(異或方程組)

2021-09-26 10:44:19 字數 2134 閱讀 7417

本作品採用知識共享署名-相同方式共享 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,特殊地乙個點就...