1. 程式人生 > >【紫書】Quadtrees UVA - 297 四叉樹塗色

【紫書】Quadtrees UVA - 297 四叉樹塗色

define turn iostream ret clas 前序 ios pre there

題意:前序遍歷給出兩個像素方塊。求兩個方塊疊加後有幾個黑色格子。

題解:每次讀進來一個方塊,就在二維數組上塗色。每次把白色塗黑就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 四叉樹塗色