1. 程式人生 > >Uva 297 四分樹

Uva 297 四分樹

每次 區域 我們 con 鍛煉 註意 順序 == 大小

題意:

有一個大小為32*32的圖像, 它可以描述為一顆四分樹, 如下圖

註意描述順序為

2 1

3 4

技術分享

給出兩棵四分樹的先序遍歷, 求兩者合並後, 黑色像素的個數。

分析:

因為本題給的樹是一顆完全的樹, 所以只需要給出先序遍歷, 就能確定整棵樹。

我們可以建一個32*32的數組模擬塗色的過程, 是一個鍛煉遞歸的好題目, 遞歸的代碼通常也可以寫的很簡便。

每次確定一個左上角坐標(r,c), 和長度len,就可以把一個矩形區域填充。

最後數一下填充多少個即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
const int len = 32; int buf[len][len], cnt; char s[maxn]; // 2 1 // 3 4 int draw(int& p, int r, int c,int len){ char ch = s[p++]; if(ch == p){ draw(p,r,c+len/2, len/2); draw(p,r,c , len/2); draw(p,r+len/2,c, len/2); draw(p,r+len/2,c+len/2, len/2); }else if(ch ==
f){ for(int i = r; i < r+len; i++){ for(int j = c; j < c +len; j++){ if(buf[i][j] == 0) { buf[i][j] = 1; cnt++; } } } } } int main(){ int T; scanf("%d", &T); while(T--){ memset(buf,
0,sizeof(buf)); cnt = 0; for(int i= 0; i < 2; i++){ scanf("%s", s); int p = 0; draw(p , 0 , 0, len); } printf("There are %d black pixels.\n",cnt); } }

Uva 297 四分樹