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="\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 }
View Code

 

你可能感兴趣的:(dtree)