【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("\n");
22 }
23 printf("\n");
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\n",++cas);
72 for(int i=1;i<=30;i++)
73 {
74 printf("%d ",ans[i]);
75 if(i%6==0) printf("\n");
76 }
77 }
78 return 0;
79 }