poj 1222 EXTENDED LIGHTS OUT 高斯消元

这个题有很多解法,不过还是觉得高斯消元比较好……

以前用其他方法做的:

#include<iostream>
#include<cstring>
using namespace std;
int press[6][8];
int puzzle[6][8];
int main()
{
    int i,n;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        int j,k,m,a;
        memset(press,0,sizeof(press));
        for(j=1;j<=5;j++)
            for(k=1;k<=6;k++)
                cin>>puzzle[j][k];
        for(j=1;j<6;j++)
            press[1][j]=0;
        while(1)
        {
            for(m=2;m<6;m++)
                for(a=1;a<7;a++)
                    press[m][a]=(puzzle[m-1][a]+press[m-1][a]+press[m-1][a+1]+press[m-1][a-1]+press[m-2][a])%2;
            for(a=1;a<7;a++)
                    if((press[5][a]+press[4][a]+press[5][a+1]+press[5][a-1])%2!=puzzle[5][a])
                        break;
            if(a==7)
                break;
            press[1][1]++;
            k=1;
            while(press[1][k]>1)
            {
                press[1][k+1]++;
                k++;
                press[1][k-1]=0;
            }
        }
        cout<<"PUZZLE #"<<i<<endl;
        for(a=1;a<=5;++a)
        {
            cout<<press[a][1]<<' ';
            for(j=2;j<7;++j)
                 cout<<press[a][j]<<' ';
            cout<<endl;
        }
    }
    return 0;
}
View Code

用高斯消元做的:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
int an[30][31],ans[30];
void Gauss(int n)
{
    int i,j,k,ma,mb,LCM;
    for(i=0;i<n;i++){
        int row=i;
        for(j=i+1;j<n;j++){
            if(an[row][i]<an[j][i]) row=j;
        }
        if(row!=i){
            for(j=0;j<=n;j++)
                swap(an[row][j],an[i][j]);
        }
        for(j=i+1;j<n;j++){
            if(an[j][i]){
                for(k=i;k<=n;k++){
                    an[j][k]^=an[i][k];
                }
            }
        }
    }
    for(i=29;i>=0;i--){
        for(j=i+1;j<n;j++)
            an[i][30]^=(ans[j]*an[i][j]);
        ans[i]=an[i][30];
    }
}
int main()
{
    int t,len,i,j,k=0,a,b,x,y,cnt;
    cin>>t;
    while(t--){
        for(i=0;i<30;i++){
            cin>>an[i][30];
            ans[i]=0;
        }
        for(i=0;i<30;i++){
           a=i/6;
           b=i%6;
           for(j=0;j<30;j++){
                x=j/6;
                y=j%6;
                if(abs(a-x)+abs(b-y)<=1)
                    an[i][j]=1;
                else an[i][j]=0;
           }
        }
        Gauss(30);
        printf("PUZZLE #%d
",++k);
        cnt=0;
        for(i=0;i<30;i++){
            cout<<ans[i];
            if(i%6==5) cout<<endl;
            else cout<<' ';
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3233329.html