(DFS)四分树
題目:
如圖6-8所示,可以用四分樹來表示一個黑白圖像,方法是用根結點表示整幅圖像,然后把行列個分城兩等分,按照圖中的方式編號,從左到右對應4個子結點。如果某子結點對應的取余全白或全黑,則直接用一個黑結點或者白結點表示:如果即有黑又有白,則用一個灰結點表示,并且為這個區域遞歸建樹。
給出兩棵四分樹的先序遍歷,求二者合并之后(黑色部分合并)黑色像素的個數。p表示中間結點,f表示黑色(full),e表示白色(empty)。
每個圖的大小都為32*32,輸出黑色塊的個數。
分析與解答:
1.輸入字符串,然后調用函數
2.函數中,遇見p就模擬建樹,這個題用到了利用坐標的技巧來分割區域,
行 Row
列 Column
3.注意你遍歷涂色時候,是根據黑色坐標的范圍來對大矩陣賦值的,所以他每次調用傳遞坐標,傳遞w。
#include<cstdio> #include<cstring>const int len = 32; const int maxn = 1024 + 10; char s[maxn]; int buf[len][len], cnt;// 把字符串s[p..]導出到以(r,c)為左上角,邊長為w的緩沖區中 // 2 1 // 3 4 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); // 1draw(s, p, r, c , w/2); // 2draw(s, p, r+w/2, c , w/2); // 3draw(s, p, r+w/2, c+w/2, w/2); // 4} 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;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(s, p, 0, 0, len);}printf("There are %d black pixels.\n", cnt);}return 0; }總結
- 上一篇: pitr 原理_PostgreSQL基于
- 下一篇: linux下载命令 scp,linux命