poj 1222

高斯消元

代码:

#include<iostream>
#include<fstream>

using namespace std;

int move[5][2]={0,0,0,1,0,-1,1,0,-1,0};
int n,m;
int map[31][31];
int a[31][31];
int x[31];

void solve(){
    int i,j,k,s,t;
    j=0;
    for(i=0;i<30&&j<30;i++,j++)
    {
        for(k=i;k<30;k++)
            if(a[k][j]==1)
                break;
        if(k==30)
        {
            i--;
            continue;
        }
        if(k!=i)
        {
            for(s=j;s<31;s++)
            {
                swap(a[k][s],a[i][s]);   
            }
        }
        for(k=i+1;k<30;k++)
            if(a[k][j]==1)
            {
                for(s=j;s<31;s++)
                    a[k][s]=a[k][s]^a[i][s];
            }
    }
    memset(x,0,sizeof(x));
    for(i=k-1;i>=0;i--)
    {
        for(j=i+1;j<30;j++)
            a[i][30]^=(a[i][j]&&x[j]);
        x[i]=a[i][30];
    }
    for(i=0;i<5;i++)
    {
        for(j=0;j<6;j++)
            cout<<x[i*6+j]<<' ';
        cout<<endl;
    }
}

void read(){
//    ifstream cin("in.txt");
    int i,j,k,s,t,cas1;
    int cas;
    for(i=0;i<5;i++)
        for(j=0;j<6;j++)
        {
            for(k=0;k<5;k++)
            {
                s=move[k][0]+i;
                t=move[k][1]+j;
                if(s>=0&&s<5&&t>=0&&t<6)
                    map[i*6+j][s*6+t]=1;
            }
        }
    cin>>cas;
    for(cas1=1;cas1<=cas;cas1++)
    {
        cout<<"PUZZLE #"<<cas1<<endl;
        for(i=0;i<5;i++)
            for(j=0;j<6;j++)
            {
                cin>>map[i*6+j][30];
            }
        for(i=0;i<31;i++)
            for(j=0;j<31;j++)
                a[i][j]=map[i][j];

        solve();

    }

}

int main(){
    read();
    return 0;
}

posted on 2011-05-25 20:13  宇宙吾心  阅读(545)  评论(0)    收藏  举报

导航