poj1222 EXTENDED LIGHTS OUT

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
int map[5][6];
int A[30][31];
#define in(x,y) (x>=0&&x<5&&y>=0&&y<6)
void change(int a[31],int b[31])
{
    int c[31];
    int i;
    for(i=0;i<31;i++)
    {
        c[i]=a[i];
    }
    for(i=0;i<31;i++)
    {
        a[i]=b[i];
    }
    for(i=0;i<31;i++)
    {
        b[i]=c[i];
    }
}
void jian(int a[31],int b[31],int k)
{
    int i;
    int n=(-1)*a[k]/b[k];
    for(i=0;i<31;i++)
    {
        a[i]=(a[i]+(n*b[i]))%2;
    }
}
int main()
{
    //freopen("out.txt","w+",stdout);
    int total;
    int counter=1;
    scanf("%d",&total);
    while(total--)
    {
        printf("PUZZLE #%d\n",counter++);
        int i,j,k;
        for(i=0;i<5;i++)
        {
            for(j=0;j<6;j++)
            {
                scanf("%d",&map[i][j]);
            }
        }
        int x[30];
        int temp1,temp2;
        memset(A,0,sizeof(A));
        int np=0;
        for(i=0;i<5;i++)
        {
            for(j=0;j<6;j++)
            {
                for(k=0;k<5;k++)
                {
                    temp1=i+dir[k][0];
                    temp2=j+dir[k][1];
                    if(!in(temp1,temp2))
                    {
                        continue;
                    }
                    A[np][temp1*6+temp2]=1;
                }
                A[np][30]=map[i][j];
                np++;
            }
        }
        int maxi;
        for(i=0,k=0;i<30&&k<30;i++,k++)//确定第i行,并将i+1,i+2,,,,29行的第k列清0
        {
            maxi=i;
            for(j=i+1;j<30;j++)
            {
                if(abs(A[j][k])>abs(A[maxi][k]))
                {
                    maxi=j;
                }
            }
            //第j行的第k列为最大
            if(A[maxi][k]==0)
            {
                i--;
                continue;
            }
            j=maxi;
            if(i!=j)
            {
                change(A[i],A[j]);
            }
            //已确定第i行
            for(j=i+1;j<30;j++)
            {
                if(A[j][k]!=0)
                {
                    jian(A[j],A[i],k);//用A[i]将A[j]的第k列清0
                }
            }
            /*
            int ii,jj;
            for(ii=0;ii<30;ii++)
            {
                for(jj=0;jj<31;jj++)
                {
                    printf("%d ",A[ii][jj]);
                }
                printf("\n");
            }
            printf("\n\n");
            */
        }
        for(i=29;i>=0;i--)
        {
            //A[i][i],A[i][i+1],
            int temp;
            temp=A[i][30];
            for(j=i+1;j<=29;j++)
            {
                temp-=x[j]*A[i][j];
            }
            if(A[i][i]==0)
            {
                x[i]=0;
            }
            else
            {
                x[i]=temp/A[i][i];
            }
        }
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
            {
                printf("%d ",abs((x[i*6+j])%2));
            }
            printf("%d\n",abs((x[i*6+5])%2));
        }
    }
    return 0;
}

posted @ 2012-07-12 08:45  willzhang  阅读(248)  评论(0编辑  收藏  举报