您的位置:首页 > 其它

poj1222 EXTENDED LIGHTS OUT

2012-07-12 08:45 281 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: