转载请注明出处: 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. 如何向java后台的对象中传数组

    1.后台对象的参数需要是是list对象 /* * copyright : GLOBALROAM Ptd Ltd * VmCreateInfo.java * Author: * zhangpengyan ...

  2. iframe和response.sendRedirect使用的问题

    一.iframe下使用response.sendRedirect的问题 一般使用filter过滤用户是否登录,如果用户没有登陆则转向登陆页面,这时候可以使用response.sendRedirect( ...

  3. tableView点击后取消选中效果

    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; @impo ...

  4. Python网络编程踩的坑

    错误:socket.error: [Errno 10013] 原因:端口号被占用 解决:换其他的端口号或者将其他应用的端口号关闭 错误:File "D:/pyworkspace/homewo ...

  5. js基础小总结之string&array&object

    一.数据类型之间的转换 string--->number :parseInt(string)/parseFloat(string); 注:在Date中,因为返回值date为单位为ms的字符串,将 ...

  6. 让WordPress的作者在后台只能看到自己的文章

    今天需要对WordPress后台进行调整,目的是为了只能让当前用户看见自己所发表的文章,而WordPress默认是登陆用户可以看到所有用户发表的文章. WordPress中的用户角色分的比较详细,作者 ...

  7. c++ 10

    一.二叉树 1.基本特征 1)树型结构的最简模型,每个节点最多有两个子节点--左子节点和右子节点. 2)单根性,每个子节点有且仅有一个父节点,整棵树有且仅有一个根节点. 3)递归性,以任何一个节点为根 ...

  8. Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入

    原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...

  9. DB2 中日期 比较

    在DB2中的Date 一共识别三种格式,最常见的是这样 '2013-12-12' 对,你没看错,DB2认为这样的字符串就是Date数据 然后我们可以利用函数这样寻找日期区间 select * from ...

  10. Smallest Rectangle Enclosing Black Pixels 解答

    Question An image is represented by a binary matrix with 0 as a white pixel and 1 as a black pixel. ...