poj 1830 開關問題 高斯消元

2021-08-04 16:42:00 字數 1988 閱讀 7038

description

有n個相同的開關,每個開關都與某些開關有著聯絡,每當你開啟或者關閉某個開關的時候,其他的與此開關相關聯的開關也會相應地發生變化,即這些相聯絡的開關的狀態如果原來為開就變為關,如果為關就變為開。你的目標是經過若干次開關操作後使得最後n個開關達到乙個特定的狀態。對於任意乙個開關,最多只能進行一次開關操作。你的任務是,計算有多少種可以達到指定狀態的方法。(不計開關操作的順序)

input

輸入第一行有乙個數k,表示以下有k組測試資料。

每組測試資料的格式如下:

第一行 乙個數n(0 < n < 29)

第二行 n個0或者1的數,表示開始時n個開關狀態。

第三行 n個0或者1的數,表示操作結束後n個開關的狀態。

接下來 每行兩個數i j,表示如果操作第 i 個開關,第j個開關的狀態也會變化。每組資料以 0 0 結束。

output

如果有可行方法,輸出總數,否則輸出「oh,it』s impossible~!!」 不包括引號

sample input

2 3

0 0 0

1 1 1

1 2

1 3

2 1

2 3

3 1

3 2

0 0

3 0 0 0

1 0 1

1 2

2 1

0 0

sample output

4 oh,it』s impossible~!!

hint

第一組資料的說明:

一共以下四種方法:

操作開關1

操作開關2

操作開關3

操作開關1、2、3 (不記順序)

思路: 假設初始狀態是110,目標狀態是101,則相當於初始狀態為000,目標狀態為011。接下來對於n個開關我們可以列出n個方程,有n個未知量,從而構成n*n矩陣對應每個開關的最終狀態,構建乙個增廣矩陣,用高斯消元求出自由變元(開關)的個數res,每個開關只有兩種狀態開或關,所以答案即為2^res。對於第i個方程的第i個變元的係數預設為1.(第i個開關對自己本身也會有影響)

**如下

#include 

#include

#include

#include

#define ll long long

const

int maxn=33;

int matrix[maxn][maxn];//儲存增廣矩陣

//int copymatrix[maxn][maxn];//副本

using

namespace

std;

int gauss(int a[maxn],const

int&m,const

int &n)//m變元的個數,n方程的個數

if(a[r][i]==0)//第i個變元的係數全為0,說明這個變元是自由變元

for(int j=0;j//消去其他方程的i的變元

if((j!=r)&&(a[j][i]!=0))

for(int k=i;k<=m;k++)

a[j][k]^=a[r][k];

r++;//矩陣的秩加1

}

for(int i=r;i//矩陣的秩下面的方程 係數都為0 0*x1+0*x2+...+0*xn恆等於0 ,若!=0則無解

if(a[i][m])

return -1;

return res;

} int main()

int a,b;

while(1)

int res=gauss(matrix,n,n); //n個變元n個方程

if(res==-1)

printf("oh,it's impossible~!!\n");

else

}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...