Quadtrees UVA - 297 (四分树,分治与递归Ⅰ)

题目链接

题目大意:题目大意:四叉树,给 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;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值