poj1623 Squadtrees

转载请注明出处: 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="";
 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="";
 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 }
View Code
原文地址:https://www.cnblogs.com/fraud/p/4082301.html