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'; } }
|