高斯消元,可以直接消的
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #define MAXN 45*45 6 #define For(i,x,y) for(register int i=x;i<=y;i++) 7 using namespace std; 8 int X,Y; 9 int a[MAXN][MAXN]; 10 int c(int x,int y){return (x-1)*Y+y;} 11 int d[5]={0,-1,0,1,0}; 12 void init(){ 13 scanf("%d%d",&X,&Y); 14 int x,y; 15 For(i,1,X){ 16 For(j,1,Y){ 17 a[c(i,j)][c(i,j)]=1; 18 For(k,0,3){ 19 x=i+d[k],y=j+d[k+1]; 20 if(1<=x&&x<=X&&1<=y&&y<=Y){ 21 a[c(i,j)][c(x,y)]=1; 22 } 23 } 24 a[c(i,j)][c(X,Y)+1]=0; 25 } 26 } 27 } 28 int ans[45][45]; 29 void guass(int m,int n){ 30 int line=1; 31 For(k,1,m){ 32 int i=line; 33 while(i<=m&&!a[i][k])i++; 34 if(i>m){ 35 for(i=1;i<line;i++){ 36 if(a[i][k])a[i][n]^=1,a[i][k]=0; 37 } 38 continue; 39 } 40 if(i!=line)swap(a[i],a[line]); 41 for(i=1;i<=m;i++){ 42 if(i==line)continue; 43 if(a[i][k]){ 44 For(j,k,n){ 45 a[i][j]^=a[line][j]; 46 } 47 } 48 } 49 line++; 50 } 51 line=1; 52 For(i,1,X){ 53 For(j,1,Y){ 54 if(a[line][c(i,j)]){ 55 ans[i][j]=a[line][n]; 56 line++; 57 } 58 else{ 59 ans[i][j]=1; 60 } 61 } 62 } 63 } 64 void solve(){ 65 guass(c(X,Y),c(X,Y)+1); 66 For(i,1,X){ 67 For(j,1,Y-1){ 68 printf("%d ",ans[i][j]); 69 } 70 printf("%d\n",ans[i][Y]); 71 } 72 } 73 int main() 74 { 75 // freopen("data.in","r",stdin); 76 init(); 77 solve(); 78 return 0; 79 }