高斯消元模板题
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int equ = 30 , var = 30;
int a[33][33] , map[6][6] ,x[33];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
void debug()
{
puts("debug");
for(int i = 0;i < equ; i++)
{
for(int j = 0;j < var+1;j ++)
printf("%d ",a[i][j]);
puts("");
}
puts("end");
}
void gauss()
{
int i , j, k;
int row = 0 , col = 0;
for( ;row < equ && col < var ; row ++, col++)
{
int maxr = row;
for(i = row+1;i < equ; i++)
if(a[i][col])
maxr = i;
if(maxr != row)
for(i = col;i < var+1;i ++)
swap(a[maxr][i] , a[row][i]);
if(!a[row][col])
{
row--;
continue;
}
for(i = row+1;i < equ; i++)
if(a[i][col])
for(j = col;j < var+1;j ++)
a[i][j] ^= a[row][j];
}
// debug();
for(i = var-1;i >= 0 ; i--)
{
x[i] = a[i][var];
for(j = i+1;j < var; j++)
if(x[j])
x[i] ^= a[i][j];
}
for(i = 0;i < var; i++)
{
printf("%d", x[i]);
if((i+1)%6==0)
puts("");
else
printf(" ");
}
}
int main()
{
int i, j,k;
int t , cas = 1;
scanf("%d", &t );
while(t--)
{
memset(a, 0, sizeof(a));
for(i = 0;i < 5; i++)
for(j = 0;j < 6; j++)
{
scanf("%d", &map[i][j]);
int cur = 6*i+j;
a[cur][30] = map[i][j];
}
for(i =0;i < 5; i++)
for(j = 0;j < 6; j++)
{
int st = 6*i+j;
a[st][st] = 1;
for(k = 0;k < 4; k++)
{
int x = dx[k]+i;
int y = dy[k]+j;
int to = 6*x+y;
if(x >= 0 && y >= 0 && x < 5 && y < 6)
a[st][to] = 1;
}
}
printf("PUZZLE #%d\n" , cas++);
gauss();
}
return 0;
}