zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    jQuery 事件注册
    jQuery 获取元素当前位置offset()与position()
    jquery scrollTop()与scrollLeft()
    linux常用命令
    php5.6+apache2.4环境配置
    php 开启socket配置
    Node.js的学习路线
    apache配置rewrite及.htaccess文件(转载)
    php 获取域名等Url
    html5的本地存储
  • 原文地址:https://www.cnblogs.com/fraud/p/4082301.html
Copyright © 2011-2022 走看看