码迷,mamicode.com
首页 > 其他好文 > 详细

【紫书】Quadtrees UVA - 297 四叉树涂色

时间:2018-04-12 22:19:44      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:AC   ret   max   右上角   namespace   scan   lis   efi   size   

题意:前序遍历给出两个像素方块。求两个方块叠加后有几个黑色格子。

题解:每次读进来一个方块,就在二维数组上涂色。每次把白色涂黑就cnt++;

   具体递归方法是以右上角坐标与边长为参数,每次通过几何规律往下递归一层。

   如果当前节点是‘p‘就继续递归,如果是f,e就说明是叶子结点,e直接返回,f对整个区域涂色。

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include<stdio.h>
#include<algorithm>
#include<string>
#include<vector>
#include<list>
#include<set>
#include<iostream>
#include<string.h>
#include<queue>
#include<string>
#include<sstream>
using namespace std;
const int maxn = 1024+5;
const int len = 32;
char s[maxn];
int buf[len][len], cnt;
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);
        draw(s, p, r, c, w / 2);
        draw(s, p, r + w / 2, c, w / 2);
        draw(s, p, r + w / 2, c + w / 2, w / 2);

    }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++) {
            scanf("%s", s);
            int p = 0;
            draw(s, p, 0, 0, len);
        }
        printf("There are %d black pixels.\n", cnt);
    }
    return 0;
}

 

【紫书】Quadtrees UVA - 297 四叉树涂色

标签:AC   ret   max   右上角   namespace   scan   lis   efi   size   

原文地址:https://www.cnblogs.com/SuuT/p/8810319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!