看这个就懂了
#include <bits/stdc++.h> using namespace std; const int maxn = 2000; int a[maxn][maxn]; int x[maxn]; int dx[]= {0,0,-1,0,1}; int dy[]= {0,-1,0,1,0}; void Guass(int equ,int var) { int row,col; row=col=0; while(row<equ && col<var) { //列非零主 int r=row; for(int i=row; i<equ; i++) if(a[i][col]!=0) { r=i; break; } if(r!=row) { for(int j=col; j<var+1; j++) swap(a[row][j],a[r][j]); } if(a[row][col]==0)//说明有自由变元 { col++; continue; } //消元 for(int i=row+1; i<equ; i++) { if(a[i][col]==0) continue; for(int j=col; j<var+1; j++) a[i][j]^=a[row][j]; } row++; col++; } int num = col-row; for(int i=var-1; num!=0; i--,num--) x[i] = 1; num = col-row; for(int i=equ-num-1; i>=0; i--) { x[i]=a[i][var]; for(int j=i+1; j<var; j++) x[i]^=(a[i][j]*x[j]); } } int main() { // freopen("in.txt","r",stdin); int t,n,m; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); memset(a,0,sizeof(a)); for(int i=0; i<n; i++) for(int j=0; j<m; j++) for(int k=0; k < 5; k++) { int nx = i+dx[k]; int ny = j+dy[k]; if(nx >= 0 && nx < n && ny >= 0 && ny < m) a[i*m+j][nx*m+ny] = 1; } Guass(n*m, n*m); for(int i=0; i<n; i++) { for(int j=0; j<m-1; j++) printf("%d ", x[i*m+j]); printf("%d ", x[i*m+m-1]); } } return 0; }