【poj1222-又一道开关问题】高斯消元求解异或方程组

题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭。每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉。

题解:

这题和上一题几乎完全一样。。就是要输出解。。

然后我发现我回代的过程错了TAT 已修改上一题代码和模版

因为回代的过程合!并!了!

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 
 9 const int N=35;
10 int a[N][N],ans[N];
11 int dx[5]={0,1,0,-1,0};
12 int dy[5]={0,0,1,0,-1};
13 int idx(int x,int y){return (x-1)*6+y;}
14 
15 void output()
16 {
17     for(int i=1;i<=30;i++)
18     {
19         for(int j=1;j<=31;j++) 
20             printf("%d ",a[i][j]);
21         printf("
");
22     }
23     printf("
");
24 }
25 
26 void gauss()
27 {
28     int i,j,k,l;
29     memset(ans,0,sizeof(ans));
30     for(i=1,j=1;i<=30 && j<=30;j++)
31     {
32         for(k=i;k<=30;k++)
33             if(a[k][j]) break;
34         if(a[k][j])
35         {
36             for(l=1;l<=31;l++) swap(a[i][l],a[k][l]);
37             for(l=1;l<=30;l++)//debug从1开始(回代)
38             {
39                 if(l!=i && a[l][j])
40                     for(k=1;k<=31;k++) 
41                         a[l][k]^=a[i][k];
42             }
43             i++;
44         }
45     }
46     for(int j=1;j<i;j++) ans[j]=a[j][31];
47     //*元不是必须按的,则标记为0
48 }
49 
50 int main()
51 {
52     freopen("a.in","r",stdin);
53     int x,y,T,cas=0;
54     scanf("%d",&T);
55     while(T--)
56     {
57         memset(a,0,sizeof(a));
58         for(int i=1;i<=5;i++)
59             for(int j=1;j<=6;j++)
60             {
61                 scanf("%d",&a[idx(i,j)][31]);
62                 for(int k=1;k<=4;k++)
63                 {
64                     x=i+dx[k];y=j+dy[k];
65                     if(x>5 || y>6 || x<1 || y<1) continue;
66                     a[idx(i,j)][idx(x,y)]=1;
67                 }
68             }
69         for(int i=1;i<=30;i++) a[i][i]=1;
70         gauss();
71         printf("PUZZLE #%d
",++cas);
72         for(int i=1;i<=30;i++)
73         {
74             printf("%d ",ans[i]);
75             if(i%6==0) printf("
");
76         }
77     }
78     return 0;
79 }