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
/*********************************
* 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的更多相关文章
随机推荐
- C#设置鼠标在控件上面时,改变光标形状
//设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) ...
- Qt信号槽写法
1.标准写法 2.lamda表达式写法 3.地址函数指针写法
- JSON对象与JSON数组的长度和遍历方法
JSON对象与JSON数组的长度和遍历方法 1.json对象的长度与遍历 结构:var json={“name”:”sm”,”sex”:”woman”} ...
- Ubuntu 修改 Apache2 用户组 方法
检查/etc/apache2/envvars文件,发现其中需要使用/etc/apache2/envvars文件中的以下几个环境变量 export APACHE_RUN_USER=www-data ex ...
- LAMP 环境搭建之源码包编译安装
mysql用的二进制包安装. Apache php 用的源码包 mysql版本5.5.46 Apache版本2.4.7 PHP版本:5.5 mysql安装部分参考了阿铭linux的内容. 这是 ...
- Max Min
def main(): n = int(raw_input()) k = int(raw_input()) k_arr = [] min_dif = 9999999999 # 根据input要求,规定 ...
- jquery checkbox 全选、取消全选
$("#checkall").click(function(){ $("input[name='uid']").prop("checked" ...
- 【转】ubuntu 12.04 LTS将关闭最大化最小化移动到右上角
原文网址:http://www.4byte.cn/learning/114801.html ubuntu 12.04 LTS将关闭最大化最小化移动到右上角 还是按下“ALT +F2”组合键,输入g ...
- C++初始化列表问题
C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误 class ClassA{private ClassB arrayOfObjectClassB ...
- < welcome > 一起学习,进步,分享。
现在时间:2014-3-24 hello world my blog. 第一次做博客,欢迎各路朋友指教.慢慢的分享学习到得东西,本人目前正在做IOS,也在学习数据库简单地应用. 作为一个IOS开发者, ...