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); } }
相关文章推荐
- ACM zoj 1217(自定义散列函数实现)
- Quadtree - ZOJ 1955 四分树
- ACM zoj 3533(伸展树实现)
- ACM zoj 1789(并查集实现)
- ACM zoj 2724(堆实现 发现段错误)
- J2EE Web服务开发系列之十三: 实现安全的AXIS Web服务,第2部分
- 转:最近看了一篇文章用PHP实现手机对jar,jad文件的下载 作者:陈泽|SurfChen
- 实例讲解ASP实现抓取网上房产信息
- sqlserver中实现递归查询
- 利用winrar实现自动打包备份的功能!
- 键树算法的实现
- Html细线表格的实现
- 实现VMware共享本地文件夹
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 非同步HASH结构的简单实现
- js装载xml文件然后发向服务器的实现代码
- pluto实现分析(6)
- 实现安全的服务器配置
- 使用Before通知的形式实现
- reactos操作系统实现(187)