您的位置:首页 > 其它

数学专项matrix:LA 2561

2013-08-05 23:46 471 查看
显然可以以30个按钮是否按下为变量列出30个在模2剩余系下的方程,然后进行高斯消元即可,因为是在模2剩余下,所以加减操作都可以通过异或来完成。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef int matrix[35][35];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
matrix A;
void gauss()
{
int i=0,j=0,k,r,u;
while(i<30 && j<30)
{
r=i;
for(k=i;k<30;k++)
if(A[k][j]) {r=k;break;}
if(A[r][j])
{
if(r!=i) for(k=0;k<=30;k++) swap(A[r][k],A[i][k]);
for(u=i+1;u<30;u++) if(A[u][j])
for(k=i;k<=30;k++) A[u][k]^=A[i][k];
i++;
}
j++;
}
for(i=29;i>=0;i--)
for(j=i+1;j<30;j++)
A[i][30]^=A[j][30]*A[i][j];
}
int main()
{
int T,kase=1;
scanf("%d",&T);
while(T--)
{
memset(A,0,sizeof(A));
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
scanf("%d",&A[i*6+j][30]);
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
{
A[i*6+j][i*6+j]++;
for(int k=0;k<4;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x>=0 && x<5 && y>=0 && y<6)
A[x*6+y][i*6+j]++;
}
}
gauss();
printf("PUZZLE #%d\n",kase++);
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
if(j==5) printf("%d\n",A[i*6+j][30]);
else printf("%d ",A[i*6+j][30]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: