编辑代码

#include<bits/stdc++.h>
using namespace std;

int n,a[100][100],c[101],answer;
void ans(int an,int point)
{
    int b[101][101];
    c[point]=an;
    if (an&&a[point/n+1][point%n]!=3) 
     {
        int le=0,ri=n+1;
        for (int k=1;k<=n;k++) 
         if (a[point/n+1][k]==3) 
          {
              if (k<point%n) le=k;
              if (ri==n+1&&k>point%n) ri=k;
          }
        for (int k=le+1;k<ri;k++) a[point/n+1][k]=(a[point/n+1][k]+1)%2;
        le=0;ri=n+1;
        for (int k=1;k<=n;k++) 
         if (a[k][point%n]==3) 
          {
              if (k<(point/n+1)) le=k;
              if (ri==n+1&&k>(point/n+1)) ri=k;
          }
        for (int k=le+1;k<ri;k++) a[k][point%n]=(a[k][point%n]+1)%2;
        a[point/n+1][point%n]=(a[point/n+1][point%n]+1)%2; 
     }   
    if (point==n*n)
     {
        int w=0; 
        for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (a[i][j]>0) w++;
        if (w==n*n) 
         {
            for (int i=1;i<=n;i++) 
             {
                for (int j=1;j<=n;j++) printf("%d ",c[i*n-n+j]);
                printf("\n");
             }
            exit(0);
         } 
     }
    else
     {
        for (int i=1;i<=n;i++)
         for (int j=1;j<=n;j++)
          b[i][j]=a[i][j];
         ans(0,point+1);
         for (int i=1;i<=n;i++)
          for (int j=1;j<=n;j++)
           a[i][j]=b[i][j];
         ans(1,point+1);
         for (int i=1;i<=n;i++)
          for (int j=1;j<=n;j++)
           a[i][j]=b[i][j];
     } 
}

 int main()
 {
     scanf("%d",&n);
     for (int i=1;i<=n;i++)
      for (int j=1;j<=n;j++)
       scanf("%d",&a[i][j]);
    for (int i=0;i<=1;i++) ans(i,1);
 }