poj 1222 EXTENDED LIGHTS OUT

高斯消元
#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

#include<map>

#include<cmath>

#define LL long long



using namespace std;



const int N=35;



int lx[4]={1,-1,0,0};

int ly[4]={0,0,1,-1};

int a[N][N];

int ans[N];

int n;

void Gauss()

{

    int row=0;

    int col=0;

    while(row<n&&col<n)

    {

        int k=-1;

        for(int i=row;i<n;++i)

        {

            if(a[i][col]!=0)

            {

                k=i;break;

            }

        }

        if(k!=row)

        {

            for(int j=col;j<=n;++j)

            {

                swap(a[row][j],a[k][j]);

            }

        }

        int x=a[row][col];

        for(int i=row+1;i<n;++i)

        {

            int y=a[i][col];

            for(int j=col;j<=n;++j)

            {

                a[i][j]=(a[i][j]*x-y*a[row][j])%2;

            }

        }

        ++row;++col;

    }

    //cout<<row<<" "<<col<<endl;

    for(int i=row-1;i>=0;--i)

    {

        int sum=0;

        for(int j=i+1;j<n;++j)

        sum=sum+(ans[j]*a[i][j]);

        ans[i]=(a[i][n]-sum)/a[i][i]%2;

    }

    for(int i=0;i<5;++i)

    {

        for(int j=0;j<6;++j)

        {

            printf("%d",(ans[i*6+j]+2)%2);

            if(j<5)

            printf(" ");

        }

        printf("\n");

    }

}

int main()

{

    n=30;

    int T;

    scanf("%d",&T);

    for(int w=1;w<=T;++w)

    {

        memset(a,0,sizeof(a));

        for(int i=0;i<5;++i)

        {

            for(int j=0;j<6;++j)

            {

                int x;

                scanf("%d",&x);

                if(x==1)

                a[i*6+j][n]=1;

                a[i*6+j][i*6+j]=1;

                for(int l=0;l<4;++l)

                {

                    int l1=i+lx[l];

                    int l2=j+ly[l];

                    if(l1>=0&&l1<5&&l2>=0&&l2<6)

                    {

                        a[l1*6+l2][i*6+j]=1;

                    }

                }

            }

        }

        printf("PUZZLE #%d\n",w);

        Gauss();

    }

    return 0;

}

  

你可能感兴趣的:(extend)