您的位置:首页 > 其它

ACM zoj 1955(四分树实现)

2012-11-27 15:31 169 查看
这是道方阵颜色分割的题目,因而可以用四分树来解决。其实这道题对我来说,难点在于将要分割的颜色提取出来,因为当你遇到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);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: