POJ 1830 開關問題 高斯消元

2021-08-04 09:34:44 字數 1710 閱讀 1337

有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~!!」 不包括引號
2

30 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

4

oh,it's impossible~!!

可參照poj1222進行變型,poj 1222詳細題解

在1222中終態為0矩陣,該題中為規定的另乙個矩陣,其實直接異或原矩陣進行處理便是等式右側的矩陣值了。另外該題更簡單一點,輸入的 i,j 的值即對應 a 的值,不用再自己轉化求解 a 矩陣了。

如果存在可行方法時,其結果值是2自

由變元 ,因為自由變元的取值只有0和1兩種情況。

當化簡後增廣矩陣的秩等於原矩陣的秩且等於 n 時(即化簡後為絕對的上三角),有唯一解;

當化簡後增廣矩陣的秩等於原矩陣的秩且小於 n 時,有多組解;

當化簡後增廣矩陣的秩與原矩陣的秩不相等時(增廣矩陣化簡後存在(0,0,0,……,a)的情況),無解。

則該題中需要判斷是否存在(0,0,0,……,a)的情況。

#include

#include

#include

#include

using

namespace

std;

#define maxn 50

int a[maxn][maxn],length;

int ans[maxn];

void gauss()

if(i > k)

for(i=k+1; iif(a[i][col])}}

for(i=k; iif(a[i][length]!=0) //判斷是否有(0,0,……,a)情況,即一行左側全為0,增廣列不為 0 的情況

}printf("%d\n",(1

<<(length-k)));

return;

}int main()

int x;

for(i=0; iscanf("%d",&x);

a[i][length]=a[i][length]^x;

}int m,n;

while(~scanf("%d %d",&m,&n))

gauss();

}return

0;}

POJ 1830 開關問題 高斯消元

開關問題 time limit 1000ms memory limit 30000k total submissions 3390 accepted 1143 description 有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應...

poj 1830 開關問題 高斯消元

題意是 給一些開關的初始狀態 0 或1 在給出終止狀態,在給出相關的變化規則,規則 x 變化 則 y 也變 x y 讀入。輸出有多少種開關的撥動情況,使初始狀態變成終止狀態。此問題 很容易轉化成 高斯消元 解 異或方程組。t 方程組的自由化的個數,則結果就是 2 t include include ...

poj 1830 開關問題(高斯消元)

終止狀態是從初始狀態由開關組合影響而形成的,那麼就有乙個等式使得初始狀態可以到達終止狀態,例如a,b,c三個開關 e a xa mp a a xb mp a b xc map a c s a e b xa mp b a xb mp b b xc map b c s b e c xa mp c a x...