POJ 1222 Gauss消元法解抑または方程式

7924 ワード

第1回はどのようにガウス消元法で方程式のグループを解くかを学んで、思想は実はとても簡単で、方法は以下のリンクを見ることができます:http://blog.csdn.net/zhuichao001/article/details/5440843
    このような考えがあって、いくつかの簡単なトランプ問題も手がかりがあって、また前に1回からトランプをひっくり返してマンハッタンの距離kの点に影響する問題をしたことを覚えていて、今から見れば構想があるように見えますが、それは900点のようで、やりにくいですね.自分で振り返って考えてみましょう.まず水問題のコードを貼ってください.
#include<iostream>

#include<cstring>

#include<cstdio>

#include<string>

#include<algorithm>

using namespace std;



int m[10][10];

int ans[10][10];

int eq[40][40];



void gauss(int a[40][40])

{

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

        int k=i;

        for(;k<30;++k){

            if(a[k][i]!=0){

                break;

            }

        }

        for(int j=0;j<=30;++j){

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

        }

        for(int j=0;j<30;++j){

            if(i!=j&&a[j][i]){

                for(int k=0;k<=30;++k){

                    a[j][k]=a[i][k]^a[j][k];

                }

            }

        }

    }

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

        ans[i/6][i%6]=eq[i][30];

    }

}



int main()

{

    int T;cin>>T;int ca=0;

    while(T--)

    {

        memset(eq,0,sizeof(eq));

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

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

                scanf("%d",&m[i][j]);

                eq[i*6+j][30]=m[i][j];

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

                if(j-1>=0) eq[i*6+j][i*6+j-1]=1;

                if(j+1<6)  eq[i*6+j][i*6+j+1]=1;

                if(i*6+j-6>=0) eq[i*6+j][i*6+j-6]=1;

                if(i*6+j+6<=29) eq[i*6+j][i*6+j+6]=1;

            }

        }

        gauss(eq);

        printf("PUZZLE #%d
",++ca); for(int i=0;i<5;++i){ printf("%d",ans[i][0]); for(int j=1;j<6;++j){ printf(" %d",ans[i][j]); } puts(""); } } return 0; }