题目大意:题目大意:四叉树,给 32 × 32 的格子涂色,p 表示将当前格子分为四个象限,根据 1、2、3、4 象限的顺序处理,e 不上色,f 将当前格子涂黑,问两个图重叠后涂黑的格子数是多少。
分析:
递归画树,整个正方形分为1024个小正方形存入buf数组中(32*32),值为0为未画过,1为已经画为黑色。
画树:自己想不到什么办法,看lrj老师的模拟方法,太巧了。以当前边长,当前编号(1,2,3,4)的正方形的左上角为原点递归,若当前字符为p则递归,到p为递归结束,同时for循环使该区域内点画为黑(赋值为1)。
递归函数
void solve(string str, int &pos, int x, int y, int ll)
str:先序字符串;pos:用来移动字符;x:正方形原点横坐标;y:原点纵坐标;ll:正方形边长
我以水平向右为横坐标,竖直向左为纵坐标(只是为了好理解)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int len = 32;//整个正方形边长
int buf[len][len],cnt;
void solve(string str, int &pos, int x, int y, int ll) {
char ch = str[pos++];
if(ch=='p') {
solve(str,pos,x+ll/2,y,ll/2);
solve(str,pos,x,y,ll/2);
solve(str,pos,x,y+ll/2,ll/2);
solve(str,pos,x+ll/2,y+ll/2,ll/2);
}
else if(ch=='f') {
for(int i = x; i<x+ll; i++) {
for(int j = y; j <y+ll; j++) {
if(!buf[i][j]) {buf[i][j]=1; cnt++; }
}
}
}
}
int main() {
freopen("i.txt","r",stdin);
freopen("o.txt","w",stdout);
int n,beg;
cin >> n;
string s1, s2;
while(n--) {
memset(buf, 0, sizeof(buf)); cnt = 0;
cin >> s1 >> s2;
beg = 0;
solve(s1,beg,0,0,len);
beg = 0;
solve(s2,beg,0,0,len);
cout << "There are " << cnt << " black pixels." << endl;
}
}