• 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
  • 相关阅读:
    五子棋项目
    判断是否是素数
    双链表
    九九乘法表
    栈和队列
    c排序
    蓝桥杯 接水问题 模拟
    蓝桥杯 调和数列问题
    蓝桥杯 Hanoi问题 递归
    蓝桥杯 排列问题
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3233329.html
Copyright © 2020-2023  润新知