POJ1222熄灯问题

千年老题,以前用枚举做,现在用高斯消元做

自由元直接做成0即可

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int a[55][55];
 7 int ans[6][7];
 8 int c(int x,int y){return (x*6+y+1);}
 9 int d[5]={0,-1,0,1,0};
10 void gauss(int m,int n){
11     int line=1;
12     for(int k=1;k<=m;k++){
13         int i=line;
14         while(i<=m){if(a[i][k])break;i++;}
15         if(i>m)continue;
16         if(i!=line){swap(a[i],a[line]);}
17         for(i=1;i<=m;i++){
18             if(i!=line&&a[i][k]){
19                 for(int j=k;j<=n;j++){
20                     a[i][j]^=a[line][j];
21                 }
22             }
23         }
24         line++;
25     }
26 //    for(int i=1;i<=30;i++){
27 //        for(int j=1;j<=30;j++){
28 //            printf("%d ",a[i][j]);    
29 //        }
30 //        printf("\n");
31 //    }
32     for(int i=0;i<5;i++){
33         for(int j=0;j<6;j++){
34             ans[i][j]=a[c(i,j)][n];
35         }
36     }
37 }
38 void solve(){
39     memset(a,0,sizeof(a));
40     memset(ans,0,sizeof(ans));
41     int x;
42     for(int i=0;i<5;i++){
43         for(int j=0;j<6;j++){
44             scanf("%d",&x);
45             a[c(i,j)][31]=x;
46             a[c(i,j)][c(i,j)]=1;
47             for(int k=0;k<4;k++){
48                 int x=i+d[k],y=j+d[k+1];
49                 if(x>=0&&x<5&&y>=0&&y<6)a[c(i,j)][c(x,y)]=1;
50             }
51         }
52     }
53     gauss(30,31);
54     for(int i=0;i<5;i++){
55         for(int j=0;j<5;j++){
56             printf("%d ",ans[i][j]);
57         }
58         printf("%d\n",ans[i][5]);
59     }
60 }
61 int main()
62 {
63 //    freopen("data.in","r",stdin); 
64     int T;
65     scanf("%d",&T);
66     for(int i=1;i<=T;i++){
67         printf("PUZZLE #%d\n",i);
68         solve();
69     }
70     return 0;
71 }

 

posted @ 2018-01-13 01:01  white_hat_hacker  阅读(214)  评论(0编辑  收藏  举报