1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
   | #include<bits/stdc++.h> using namespace std; const int N=200; int g[N][N],n,m,o,ans1,ans2; struct node{     int a,b,c,d;     bool equal(int aa,int bb,int cc,int dd){         return a==aa&&b==bb&&c==cc&&d==dd;     } }tr[100010]; int dfs(int x,int y,int l){     int pre=ans2;     ans1++,ans2++;     if(l==1)return g[x][y];          l/=2;     int a=dfs(x,y,l);     int b=dfs(x,y+l,l);     int c=dfs(x+l,y,l);     int d=dfs(x+l,y+l,l);     if(a==b&&a==c&&a==d&&a==0){         ans1-=4,ans2-=4;         return 0;     }     if(a==b&&a==c&&a==d&&a==1){         ans1-=4,ans2-=4;         return 1;     }          for(int i=2;i<o;i++){         if(tr[i].equal(a,b,c,d)){             ans2=pre;             return i;         }     }     tr[o++]={a,b,c,d};     return o-1; } signed main(){     ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);     while(cin>>n>>m&&n&&m){         memset(g,0,sizeof g);         for(int i=0;i<n;i++){             for(int j=0;j<m;j++){                 char c;                 cin>>c;                 g[i][j]=c-'0';             }         }         o=2;         ans1=0;         ans2=0;         int len=1;         n=max(n,m);         while(len<n)len*=2;         dfs(0,0,len);         cout<<ans1<<" "<<ans2<<'\n';     } }
   |