转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
需要求出按题目要求建四叉树所需的结点个数,和压缩后的四叉树的结点个数(压缩即只要将相同的子树只取一颗即可),在此,我用string表示一颗子树。
读取好数据之后,直接dfs一遍即可
poj题目链接:http://poj.org/problem?id=1623
shuoj题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1701
1 /********************************* 2 * Built using CHelper plug-in 3 * Actual solution is at the top 4 * @author xyiyy @ http://www.cnblogs.com/fraud/ 5 *********************************/ 6 7 #include <iostream> 8 #include <cstring> 9 #include <map> 10 #include <cstdio> 11 using namespace std; 12 int number[10]; 13 char a[1030][1030]; 14 int col,row; 15 map<string,int>Map; 16 int flag; 17 int ans; 18 string dfs(int len,int x,int y,int deep,int &temp) 19 { 20 string s="\0"; 21 if(len==1)return s+a[x][y]; 22 if(len==2) 23 { 24 s=dfs(len/2,x,y,deep+1,temp)+dfs(len/2,x,y+len/2,deep+1,temp) 25 +dfs(len/2,x+len/2,y,deep+1,temp)+dfs(len/2,x+len/2,y+len/2,deep+1,temp); 26 int l=s.length(); 27 bool flag0=0,flag1=0; 28 for(int i=0;i<l;i++) 29 { 30 if(s[i]=='0')flag0=1; 31 else flag1=1; 32 } 33 if(flag1&&flag0) 34 { 35 temp=5;Map[s]++; 36 if(Map[s]==1)ans+=4; 37 } 38 else if(flag1){temp=1;} 39 else {temp=0;} 40 } 41 else 42 { 43 flag=0; 44 string s1="\0"; 45 s=dfs(len/2,x,y,deep+1,temp); 46 int flag0=0,flag1=0; 47 int ret=1; 48 if(temp>1) 49 ret+=temp; 50 else if(temp)flag1++; 51 else flag0++; 52 if(temp==0)s1=s1+"0"; 53 else if(temp)s1=s1+"1"; 54 s=s+dfs(len/2,x,y+len/2,deep+1,temp); 55 if(temp>1) 56 ret+=temp; 57 else if(temp)flag1++; 58 else flag0++; 59 if(temp==0)s1=s1+"0"; 60 else if(temp)s1=s1+"1"; 61 s=s+dfs(len/2,x+len/2,y,deep+1,temp); 62 if(temp>1) 63 ret+=temp; 64 else if(temp)flag1++; 65 else flag0++; 66 if(temp==0)s1=s1+"0"; 67 else if(temp)s1=s1+"1"; 68 s=s+dfs(len/2,x+len/2,y+len/2,deep+1,temp); 69 if(temp>1) 70 ret+=temp; 71 else if(temp)flag1++; 72 else flag0++; 73 if(temp==0)s1=s1+"0"; 74 else if(temp)s1=s1+"1"; 75 if(flag0==4){temp=0;s="0000";} 76 else if(flag1==4){temp=1;s="1111";} 77 else if(flag0+flag1==4) 78 { 79 s=s1; 80 temp=5; 81 Map[s]++; 82 if(Map[s]==1)ans+=4; 83 } 84 else 85 { 86 ret+=flag0+flag1; 87 temp=ret; 88 Map[s]++; 89 if(Map[s]==1) 90 { 91 ans+=flag0+flag1; 92 } 93 } 94 95 } 96 return s; 97 } 98 int main() 99 { 100 ios::sync_with_stdio(false); 101 number[0]=1; 102 int n,m; 103 //freopen("a.in","r",stdin); 104 for(int i=1;i<10;i++)number[i]=number[i-1]*2; 105 while(cin>>n>>m&&(n||m)) 106 { 107 ans=0; 108 row=n,col=m; 109 int id=0; 110 while(number[id]<n||number[id]<m)id++; 111 row=col=number[id]; 112 for(int i=0;i<row;i++) 113 { 114 for(int j=0;j<col;j++) 115 a[i][j]='0'; 116 } 117 for(int i=0;i<n;i++) 118 { 119 for(int j=0;j<m;j++) 120 { 121 cin>>a[i][j]; 122 } 123 } 124 Map.clear(); 125 int temp=0; 126 string s=dfs(row,0,0,1,temp); 127 if(temp==0||temp==1)ans=1; 128 map<string,int>::iterator it; 129 int ans1=0,ans2=0; 130 131 for(it=Map.begin();it!=Map.end();it++) 132 { 133 ans++; 134 } 135 136 if(temp==0)temp=1; 137 cout<<temp<<" "<<ans<<endl; 138 } 139 }