zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    Python Django 编写一个简易的后台管理工具2-创建项目
    leetcode-解题记录 771. 宝石与石头
    leetcode-解题记录 1108. IP 地址无效化
    Python Django 编写一个简易的后台管理工具1-安装环境
    备忘录
    Pollard_rho 因数分解
    ProgrammingContestChallengeBook
    HDU ACM-Steps
    ARCH-LINUX 折(安)腾(装)记
    各种Python小玩意收集
  • 原文地址:https://www.cnblogs.com/KonjakJuruo/p/6029337.html
Copyright © 2011-2022 走看看