转载请注明出处: 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

 /*********************************
* Built using CHelper plug-in
* Actual solution is at the top
* @author xyiyy @ http://www.cnblogs.com/fraud/
*********************************/ #include <iostream>
#include <cstring>
#include <map>
#include <cstdio>
using namespace std;
int number[];
char a[][];
int col,row;
map<string,int>Map;
int flag;
int ans;
string dfs(int len,int x,int y,int deep,int &temp)
{
string s="\0";
if(len==)return s+a[x][y];
if(len==)
{
s=dfs(len/,x,y,deep+,temp)+dfs(len/,x,y+len/,deep+,temp)
+dfs(len/,x+len/,y,deep+,temp)+dfs(len/,x+len/,y+len/,deep+,temp);
int l=s.length();
bool flag0=,flag1=;
for(int i=;i<l;i++)
{
if(s[i]=='')flag0=;
else flag1=;
}
if(flag1&&flag0)
{
temp=;Map[s]++;
if(Map[s]==)ans+=;
}
else if(flag1){temp=;}
else {temp=;}
}
else
{
flag=;
string s1="\0";
s=dfs(len/,x,y,deep+,temp);
int flag0=,flag1=;
int ret=;
if(temp>)
ret+=temp;
else if(temp)flag1++;
else flag0++;
if(temp==)s1=s1+"";
else if(temp)s1=s1+"";
s=s+dfs(len/,x,y+len/,deep+,temp);
if(temp>)
ret+=temp;
else if(temp)flag1++;
else flag0++;
if(temp==)s1=s1+"";
else if(temp)s1=s1+"";
s=s+dfs(len/,x+len/,y,deep+,temp);
if(temp>)
ret+=temp;
else if(temp)flag1++;
else flag0++;
if(temp==)s1=s1+"";
else if(temp)s1=s1+"";
s=s+dfs(len/,x+len/,y+len/,deep+,temp);
if(temp>)
ret+=temp;
else if(temp)flag1++;
else flag0++;
if(temp==)s1=s1+"";
else if(temp)s1=s1+"";
if(flag0==){temp=;s="";}
else if(flag1==){temp=;s="";}
else if(flag0+flag1==)
{
s=s1;
temp=;
Map[s]++;
if(Map[s]==)ans+=;
}
else
{
ret+=flag0+flag1;
temp=ret;
Map[s]++;
if(Map[s]==)
{
ans+=flag0+flag1;
}
} }
return s;
}
int main()
{
ios::sync_with_stdio(false);
number[]=;
int n,m;
//freopen("a.in","r",stdin);
for(int i=;i<;i++)number[i]=number[i-]*;
while(cin>>n>>m&&(n||m))
{
ans=;
row=n,col=m;
int id=;
while(number[id]<n||number[id]<m)id++;
row=col=number[id];
for(int i=;i<row;i++)
{
for(int j=;j<col;j++)
a[i][j]='';
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>a[i][j];
}
}
Map.clear();
int temp=;
string s=dfs(row,,,,temp);
if(temp==||temp==)ans=;
map<string,int>::iterator it;
int ans1=,ans2=; for(it=Map.begin();it!=Map.end();it++)
{
ans++;
} if(temp==)temp=;
cout<<temp<<" "<<ans<<endl;
}
}

poj1623 Squadtrees的更多相关文章

随机推荐

  1. Mysql学习(慕课学习笔记5)约束

    约束类型: 1.NOT NULL (非空约束) 2.PRIMARY KEY(主键约束) 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为NOT NULL (Auto_increment  ...

  2. Ubuntu 14.10安装mentohust

    关于linux下mentohust的安装本来有很多教程了,但从网上找了一些教程没有几个总结的很全面的,大都只言片语,不是太负责.下面详细的列出每一个步骤,希望能帮到有需要的人. 一 安装准备 首先下载 ...

  3. web worker使用

    使用postMessage()方法传递信息.来自Worker的数据保存在event.data中.通过message和error事件与页面通信. <script> var data = [4 ...

  4. JSP学习笔记 - 源码 -- JSP Custom Tags -- JSP自定义标记

    NetBeans 项目demo下载地址>>  http://files.cnblogs.com/files/AndrewXu/JSPCustomTags.zip

  5. 动态编译添加php模块

    注意:转载请注明出处:http://www.programfish.com/blog/?p=85 在很多时候我们用linux里搭建web服务器的时候会需要编译安装php套件,而在编译安装后可能又会需要 ...

  6. js判断是手机访问还是电脑访问

    <script type="text/javascript">        <!--        //平台.设备和操作系统         var syste ...

  7. POJ 2986 A Triangle and a Circle

    题意:给定一个三角形,以及一个圆的圆心坐标和半径,求圆和三角形的相交面积. 思路: 用三角剖分,三角形上每个线段都变成这个线段与圆心的三角形,然后算出每个三角形与圆的相交面积,然后根据有向面积的正负累 ...

  8. Find out C++ Memory Usage in Code

    You can use Microsoft Platform SDK functions to get the heap size at a specific point. If get the he ...

  9. Swing透明和变换

    以前或许大家对一个UI组件是否透明没有那么关心,但是自从Vista的毛玻璃出现后,UI透明就成了大家非常关注的一个话题,于是Java阵营开始了铺天盖地的讨论如何实现透明的效果,但是很不幸的是无论组件如 ...

  10. 关于C++中覆盖,重载,隐藏的一点说明

    C++覆盖 重载 隐藏是三个经常容易混淆的概念 这里我们简单总结下: 1.重载的条件(编译时多态) a.同一个类中 b.函数名相同,参数不同(返回值不能作为重载的条件) c.与函数是否为虚函数无关 2 ...