題意:
一幅圖有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 ...