• 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;
    }
    

      

  • 相关阅读:
    测试用例
    HDU 5024 Wang Xifeng's Little Plot(枚举)
    HDU 1165 Eddy's research II
    java大数总结
    UVA 1646 Edge Case
    HDU 2553 N皇后问题
    【24题】试题库问题【网络流】
    YAPTCHA【数论】
    YAPTCHA【数论】
    YAPTCHA【数论】
  • 原文地址:https://www.cnblogs.com/liulangye/p/2609470.html
Copyright © 2020-2023  润新知