Quadtrees UVA - 297
作者:互联网
题目链接:https://vjudge.net/problem/UVA-297
题目大意:如上图所示,可以用一个四分树来表示一个黑白图像,方法是用根节点表示整副图像,然后把行列各等分两等分,按照图中的方式进行编号,从左到右对应4个结点
如果某子结点对应的区域全为黑或白,则直接用一个黑结点或者白结点表示:如果既有黑油油白 则用一个灰结点表示 并且为这个区域递归建树。
给出两颗树的现需遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色 e表示白色
思路:首先一定要把题意读懂。 首先给你一幅图,这幅图的像素的是1024 是正方形区域 你可以看做是32*32的区域 每个块可以看做1 2 3 4个块
问你两棵树合并之后有多少个黑色像素的点。
具体怎么做呢 ? 只要我们能编写一个“画出来”的过程 边画边统计即可!
如果碰到的是p 那么接着画新的区域。 我们可以用一个数组来存储改点是否是黑色 刚开始区域是32*32的大小 我们可以看做起点是(0,0)终点是(31,31)的1024个点
四个区域正如题目要求的一样 一直遍历下去就行了
看代码:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; const int len=32; const int maxn=1024+10; char s[maxn]; int buf[len][len],cnt; /* 把字符串s[p...]导出到以(r,c)为左上角,边长为w的缓冲区内 */ //draw(s,p,0,0,len); void draw(const char* s,int& p,int r,int c,int w) { char ch=s[p++]; if(ch=='p') { draw(s,p,r,c+w/2,w/2);//1 draw(s,p,r,c,w/2);//2 draw(s,p,r+w/2,c,w/2);//3 draw(s,p,r+w/2,c+w/2,w/2);//4 } else if(ch=='f')//画黑像素 { for(int i=r;i<r+w;i++) { for(int j=c;j<c+w;j++) if(buf[i][j]==0) { buf[i][j]=1; cnt++; } } } } int main() { int t; cin>>t; while(t--) { memset(buf,0,sizeof(buf)); cnt=0; for(int i=0;i<2;i++) { cin>>s; int p=0; draw(s,p,0,0,len); } printf("There are %d black pixels.\n",cnt); } return 0; }
标签:结点,int,32,draw,len,像素,Quadtrees,297,UVA 来源: https://www.cnblogs.com/caijiaming/p/10352762.html