这是道方阵颜色分割的题目,因而可以用四分树来解决。其实这道题对我来说,难点在于将要分割的颜色提取出来,因为当你遇到Q时说明你要将后面的颜色分成四块,如果在这之中又出现Q的话,那你就要用同样的方法将Q后面的颜色进行分割。刚开始可能急于求成,没有一步步耐心地找出规律,直到最后静下心来,从中总结出规律,才将这段算法写出来。
#include <iostream>
#include <string>
#include <stdio.h>
#include <iomanip>
using namespace std;
char Array[513][513];
void loadToArray(int r,int c,int n,string str)
{
//直到首元素不为'Q',表示不用再分割
if(str[0]!='Q')
{
for(int i=r;i<n+r;++i)
for(int j=c;j<n+c;++j)
Array[i][j]=str[0];
}
else
{
//将一整块一分为四
n/=2;
string temp[4];
//将字符串str分成四份,存进temp数组中
int index=1;
for(int i=0;i<4;++i)
{
if(str[index]!='Q')
{
//不为Q时只要存一个元素即可
temp[i]=str[index];
++index;
continue;
}
else
{
int num=0;
for(int j=0;j<=num;++j)
{
temp[i]+=str[index];
//再遇到Q时,还要多存四个字母
if(str[index]=='Q')
num+=4;
++index;
}
}
}
//对每一份都调用相同的方法,再进行分割
loadToArray(r,c,n,temp[0]);
loadToArray(r,c+n,n,temp[1]);
loadToArray(r+n,c,n,temp[2]);
loadToArray(r+n,c+n,n,temp[3]);
}
}
void display(int n)
{
printf("#define quadtree_width %d\n",n);
printf("#define quadtree_height %d\n",n);
printf("static char quadtree_bits[] = {\n");
//计算像素的和
for(int i=0;i<n;++i)
{
int num=0;
while(num<n)
{
int sum=0;
for(int j=num,base=1;j<num+8;++j,base*=2)
{
if('B'==Array[i][j])
sum+=base;
}
//格式化输出
printf("0x%02x,",sum);
num+=8;
}
printf("\n");
}
printf("};\n");
}
int main()
{
int n=0;
string str;
while(scanf("%d",&n)!=EOF)
{
cin>>str;
loadToArray(0,0,n,str);
display(n);
}
}