高斯消元模板题
#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; }