整理一下这块而已
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdlib.h>
using namespace std;
#define MAX_VAR 110 //geshu
#define MAX_EQU 110 //位数
#define MAX_SIZE 110
typedef int Int;
int x[MAX_VAR];
int a[MAX_EQU][MAX_VAR];
//设方程组中方程的个数为equ,变元的个数为var
int Gauss_XOR(Int a[MAX_EQU][MAX_VAR], Int x[MAX_VAR], int var, int equ)
{
int row, col;
for (row = col = 1; row <= equ && col <= var; ++row, ++col)
{
if (!a[row][col])
{
for (int i = equ; i > row; --i)//利用初等行变换来把增广矩阵转换成行阶梯阵
{
if (a[i][col])
{
for (int j = row; j <= var + 1; ++j)
{
swap(a[i][j], a[row][j]);
}
break;
}
}
}
if (!a[row][col])
{
--row;
continue;
}
for (int i=row + 1; i<= equ; ++i)
{
if (a[i][col])
{
for (int j = var + 1; j >= col; --j)
{
a[i][j] ^= a[row][j];
}
}
}
}
//① 无解 当方程中出现(0, 0, …, 0, a)的形式,且a != 0时,说明是无解的。
for (int i = row; i <= equ; ++i)
{
if (a[i][var + 1]) return -1;
}
//唯一解 条件是k = equ,即行阶梯阵形成了严格的上三角阵。利用回代逐一求出解集。
//条件是k < equ,即不能形成严格的上三角形,自由变元的个数即为equ – k,
if (row <= var)
{
return var - row + 1;
}
for (int i = var; i >= 1; --i)
{
x[i] = a[i][var + 1];
for (int j = i + 1; j <= var; ++j)
{
x[i] ^= a[i][j] && x[j];
}
}
return 0;
}
int main()
{
int T, n;
int num;
scanf("%d", &T);
int cas = 1;
while(T--)
{
int equ = 0;
memset(x, 0, sizeof (x));
memset(a, 0, sizeof (a));
for(int i=0; i<30; i++)
{
scanf("%d", &a[i+1][31]);
}
for(int i=0; i<30; i++) //构造30个方程
{
int kn = i / 6;
int km = i % 6;
for(int j=0; j<30; j++)
{
int kx = j / 6;
int ky = j % 6;
if(abs(kx - kn) + abs(ky - km) <= 1)
a[i+1][j+1] = 1;
else
a[i+1][j+1] = 0;
}
}
int ans = Gauss_XOR(a, x, 30, 30);
//printf("ans=%d\n", ans);
printf("PUZZLE #%d\n",cas++);
for(int i=1; i<=30; i++)
{
printf("%d", x[i]);
if(i % 6 == 0)
printf("\n");
else
printf(" ");
}
}
return 0;
}