题意
一幅像素点为1024的黑白图,可以将图等分为4块,子图可以继续等分为4块,直到最小子图为1。给出两个黑白图,黑色面积的家和。用先序遍历的四叉树表示每个图,p:父节点,f:涂黑,e:白色。图的节点顺序如下:
┌ ┬ ┐
|2|1|
├ ┼ ┤
|3|4|
└ ┴ ┘
思路
建立一个32*32的矩阵,r表示行,c表示列,值为1表示黑,0表示白;DFS这棵树即可。pic[r][c]表示现在这个子图的左上角。
总结
也是看着书写的,不过这回稍微明白点了dfs这个鬼,感觉这个不能细想,要抽象着来,加油哦
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 const int maxn = 32; 7 using namespace std; 8 int pic[maxn][maxn],cnt; 9 void draw(const string a,int &p,int r,int c,int w) //p一定要是引用 10 { 11 char ch = a[p++]; 12 if(ch == 'p') { 13 draw(a,p,r,c+w/2,w/2); //1 14 draw(a,p,r,c,w/2); //2 15 draw(a,p,r+w/2,c,w/2); //3 16 draw(a,p,r+w/2,c+w/2,w/2);//4 17 } 18 else if(ch == 'f') { 19 for(int i = r; i < r+w; i++) 20 for(int j = c; j < c+w; j++) 21 if(!pic[i][j]) { 22 pic[i][j] = 1; 23 cnt++; 24 } 25 } 26 } 27 int main() 28 { 29 int T; 30 cin >> T; 31 while(T--) { 32 cnt = 0; 33 memset(pic,0,sizeof pic); 34 string a,b; 35 cin >> a >> b; 36 int p = 0; 37 draw(a,p,0,0,maxn); 38 p = 0; 39 draw(b,p,0,0,maxn); 40 printf("There are %d black pixels.\n",cnt); 41 } 42 return 0; 43 }