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\n",++k);

        cnt=0;

        for(i=0;i<30;i++){

            cout<<ans[i];

            if(i%6==5) cout<<endl;

            else cout<<' ';

        }

    }

}
View Code

 

 

你可能感兴趣的:(extend)