POJ 1830 開關問題

2021-08-15 02:14:38 字數 1402 閱讀 6192

前述:今天又領略了被假模版坑的心痛,基本都在調**。由於被問及相關poj 1222的異或方程組的相關問題,我總算是知道了昨天那個博主為什麼理解了兩天了......原來poj 1222的相關題解都是用矩陣講的異或方程組,講的賊煩,而我正好找了乙個類似卻又不存在的題目,用他的**a了這個poj 1222,渾然不知有這等難事。由於不是一開始理解這個點,矩陣的**也算是沒花我幾分鐘,然後把隊友帶出了坑。至於為什麼調這個**模板調了近一天,這個模板裡面關於找自由元的個數的**段有著極其隱蔽的錯誤,但還好拿出來驗證了一下, 避免坑害更多的人。

題目:poj 1830 開關問題

題目大意:給出燈的初始狀態,和燈的最終狀態,給出按某個燈會對哪些燈產生影響,問得到最終結果的方案總數。

解題思路:同poj 1222,使用異或方程組表示開關燈的狀態。0表示不動這個燈,1表示動這個燈,a[j][i]表示操作i是否會對j產生影響,注意一定是a[j][i]。用高斯消元法解這個異或方程組,得到自由未知量的個數(若解唯一說明自由未知量個數為0。)然後2^自由未知量個數=方案總數。關於為什麼2^自由未知量個數=方案總數,因為某個燈為自由未知量表示這個燈點不點隨意,這樣的話,每有乙個這樣的燈,就會有兩個狀態,點與不點,這樣就是2^自由未知量個數個方案嘍。

ac**:

#include

#include

#include

#include

#include

#include

#define maxn 110

using namespace std;

int a[maxn][maxn];

int x[maxn*maxn];

int xx[4]=;

int yy[4]=;

int tot,var,n;

int gauss()

if (maxr!=k)for (i=c;i<=var+1;i++)swap(a[k][i],a[maxr][i]);

}if (a[k][c]==0)

for (i=k+1;i<=tot;i++)}}

for (i=k;i<=tot;i++)if (a[i][var+1])return -1;

if (k-1=1;i--)

for (j=i+1;j<=var;j++)

if (a[i][j]*x[j])x[i]^=x[j];

return 0;

}int main()

for (i=1;i<=n;i++)

while (scanf("%d%d",&x1,&x2)!=eof&&(x1||x2))

var=tot=n;

int flag=gauss();

if (flag==-1)printf("oh,it's impossible~!!\n");

else printf("%d\n",1<

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

poj 1830 開關問題

這道題是個十分有趣的數學題。有n個開關,這n個開關兩兩之間可能有著關係,如果有關係,按下這個開關,另乙個開關的狀態也會改變。先給你n個開關的初始狀態,再給你n個開關的最終狀態,然後告訴你開關之間的關係,問你能不能通過調整開關使達到最終狀態,如果能,求方案的數量。我們用0,1分別表示開關的兩個不同狀態...