UVA 806 Spatial Structures

题意:

  如果某一大区域所有色块颜色是相同的,那么这一个大区域就算作一块,如果不同,则将其划分成四个小区域,然后重复上述步骤递归进行直到所有区域的颜色相同为止。然后根据上面划分的区域建树,小区域作为大区域的子树:然后对于每一个黑色的区域,也就是上面树上是黑色的结点,将其从叶子结点到根节点的路径表示出来,每一个非叶子结点的四条路权值分别为1、2、3、4.路径表示向黑白图像的转换则是反过来,将数字序列转换为黑白的点阵图。

分析:

  其实就是四叉树的一个运用。黑白图像转化成路径很简单。在四叉图的时候,找到黑色部分统计他到根节点的路径(5进制)。假如数的第二层的第二个是黑色,他的亲代是第一层的第三个,则它的路径是23.再把路径转化10进制,这样就是最终的路径。

  路径表示向黑白图像的转换的话。就把路径取余,这是本层的第几个节点,之后除以5 ,直到==0.

代码:

  

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
char p[80][80];
int ans;
vector<int>v;
int get(int r,int c,int w)
{
int cnt=0;
for(int i=r;i<r+w;++i)
for(int j=c;j<c+w;++j)
if(p[i][j]=='1')
++cnt;
return cnt;
}
int getval(string path)
{
int l=path.size();
int res=0;
for(int i=l-1;i>=0;--i)
res=res*5+path[i]-'0';
return res;
}
void f1(int r,int c,int w,string path)
{
//cout<<1<<endl;
int k=get(r,c,w);
if(k==0)
return;
if(k==w*w)
{
++ans;
v.push_back(getval(path));
return;
}
f1(r,c,w/2,path+'1');
f1(r,c+w/2,w/2,path+'2');
f1(r+w/2,c,w/2,path+'3');
f1(r+w/2,c+w/2,w/2,path+'4');
}
void f2(int r,int c,int w,int s)
{
if(s==0)
{
for(int i=r;i<r+w;i++)
for(int j=c;j<c+w;j++)
p[i][j]='*';
return;
}
int mod=s%5;
if(mod==1)
f2(r,c,w/2,s/5);
else if(mod==2)
f2(r,c+w/2,w/2,s/5);
else if(mod==3)
f2(r+w/2,c,w/2,s/5);
else if(mod==4)
f2(r+w/2,c+w/2,w/2,s/5);
}
int main()
{
int n,cas=0,flag=0;
while(scanf("%d",&n)&&n)
{
v.clear();
if(flag)
printf("\n");
flag=1;
if(n>0)
{
//cout<<1<<endl;
int i,j;
//cout<<n<<endl;
for(i=0;i<n;++i)
scanf("%s",p[i]);
printf("Image %d\n",++cas);
ans=0;
f1(0,0,n,"");
sort(v.begin(),v.end());
int l=v.size();
for(i=0;i<l;i++)
printf("%d%c",v[i],(i%12==11||i==l-1)?'\n':' ');
printf("Total number of black nodes = %d\n",ans);
}
if(n<0)
{
n=-n;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
p[i][j]='.';
p[i][n]=0;
}
int a;
while(scanf("%d",&a)&&a!=-1)
{
v.push_back(a);
}
printf("Image %d\n",++cas);
int l=v.size();
for(i=0;i<l;++i)
f2(0,0,n,v[i]);
for(i=0;i<n;++i)
printf("%s\n",p[i]);
}
}
}

  

posted @ 2015-10-18 19:30  幻世沉溺  阅读(227)  评论(0编辑  收藏  举报