uva297 Quadtrees 樹的重建

2021-06-17 15:11:40 字數 1534 閱讀 6988

題意:

一幅圖有1024個點, 可以對圖平均分成4塊, 並且子圖也可以再往下分, 直到乙個子圖表示乙個點。 f表示這塊子圖填滿, p表示它還有4個子圖, e表示沒有子圖(當然啦, 它也沒有填滿)。 給定兩個字串(其實就是兩幅圖, 兩棵樹), 求把兩圖合併後的圖的黑點數。

思路:可以根據兩字串建兩棵樹, 然後合併。 但是直接用字串合併似乎會更簡單。從頭到尾逐個字元比較兩個字串, 如果是ff、ee、pp則輸出f、e、p到buff,如果是pe則輸出p及p後面的4個字母(它的子圖), 如果是pf則輸出f, p後面4個字母(p當然也要讀掉, 有比較的都要在原有字串裡讀掉), 如果是pf, 則輸出f。 合併好字串後, 用遞迴的方式統計黑點數, 遇到p往下遞迴一層, 每往下遞迴一層f所代表的黑點數要除以4.

演算法複雜度:o(n), n是最長的的那個字串的長度。

**:

#include #include using namespace std;

#define max_len 3000

#define sum_bit 1024

#define pp 224

#define ff 204

#define ee 202

#define pe 213

#define pf 214

#define ef 203

void dosame(char *&, char *&, char *&);

void dope(char *&, char *&, char *&);

void dopf(char *&, char *&);

void countbit(char *&, int);

int count;

const int bit[6] = ;

int main()

else if (sum == pe) else

} else if (sum == pf) else

*p++ = 'f';

} else if (sum == ef)

if (!*p1)

break;

} else if (!*p2)

break;

}} // count

count = 0;

if (rslt[0] == 'f') else if (rslt[0] == 'e') else

// output

printf("there are %d black pixels.\n", count);

} return 0;

}void dosame(char *&p1, char *&p2, char *&p)

void dope(char *&p, char *&e, char *&rslt)

e++;

}void dopf(char *&f, char *&p)

}void countbit(char *&p, int level)

else if (*p == 'f') else

}}

UVA297建立完全四叉樹統計葉子節點

和線段樹的原理一樣,逐層遞迴去建樹,然後統計葉子節點就可以了。當時自己想的是可不可以一邊建樹一邊統計黑點的數目,好像不是很可行,或者說自己太笨,沒想到怎麼寫。include include include include include include include include include...

UVA 297四分樹(非二叉樹)

題意 用乙個四分樹來表示乙個黑白影象,方法是用根節點來表示整個影象,然後再進行等分,按照從右上角的影象開始逆時針的順序編 號,依次有四個節點,如果某子節點對應的區域是全黑或者全白,則直接用黑或者白節點來代替,如果對應的區域既有白區域,也 有黑區域,則用灰節點來表示,並且為這個區域遞迴建樹。給出兩棵四...

uva1220 樹的最大獨立集 判重

題意是挑選盡量多的人,並且每個人都不和他的父節點同時出現,很明顯的最大獨立集問題,難點在於如何判斷方案是否唯一。詳情請見劉汝佳 演算法競賽入門經典 第二版 p282 include include include include include include include define inf ...