前述:今天又領略了被假模版坑的心痛,基本都在調**。由於被問及相關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< 中文題目,就不說題目大意了 解題思路 由於對於每乙個開關最多改變一次,那麼對於每乙個開關,只有改變與不改變兩種操作,設改變操作為1,不改變操作為0,那麼對開關的操作可以用乙個n維向量x t x 1,x2 x n 其中xi 0或者 1 我們需要知道初始狀態經過某次操作之後的狀態,並拿它與目標狀態比較。... 題意 燈泡對應開關,有些開關的撥動會影響其他的開關,給出燈泡初始狀態,給出燈泡結束狀態,問有幾種操作可以完成 思路 建立矩陣,消元後有n個自由變元,答案就是2 n個 include include include includeusing namespace std const int maxn 5... 這道題是個十分有趣的數學題。有n個開關,這n個開關兩兩之間可能有著關係,如果有關係,按下這個開關,另乙個開關的狀態也會改變。先給你n個開關的初始狀態,再給你n個開關的最終狀態,然後告訴你開關之間的關係,問你能不能通過調整開關使達到最終狀態,如果能,求方案的數量。我們用0,1分別表示開關的兩個不同狀態...POJ1830 開關問題
開關問題 POJ 1830
poj 1830 開關問題