题解:建两棵树然后深搜遍历,需要注意在深搜的函数里随着树的层次变深,每个黑色小方块的值也在不断减小,所以累加的值是 1024 / pow (4, l),l是数的深度。
#include <cstdio>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 10010;
struct Node {
char c;
Node* s[4];
Node() {
c = '\0';
s[0] = s[1] = s[2] = s[3] = NULL;
}
};
int len, sum, i;
Node* build(string str) {
i++;
if (i == len)
return NULL;
Node* node = new Node;
node -> c = str[i];
if (node -> c == 'p') {
node -> s[0] = build(str);
node -> s[1] = build(str);
node -> s[2] = build(str);
node -> s[3] = build(str);
}
return node;
}
void dfs(Node* node1, Node* node2, int l) {
if (node1 == NULL && node2 == NULL)
return;
if (node2 == NULL) {
if (node1 -> c == 'f') {
sum += 1024 / pow(4, l);
return;
}
for (int i = 0; i < 4; i++)
dfs(node1 -> s[i], node2, l + 1);
return;
}
if (node1 == NULL) {
if (node2 -> c == 'f') {
sum += 1024 / pow(4, l);
return;
}
for (int i = 0; i < 4; i++)
dfs(node1, node2 -> s[i], l + 1);
return;
}
if (node1 -> c == 'f' || node2 -> c == 'f') {
sum += 1024 / pow(4, l);
return;
}
for (int i = 0; i < 4; i++)
dfs(node1 -> s[i], node2 -> s[i], l + 1);
return;
}
void Delete(Node* node) {
if (node == NULL)
return;
for (int i = 0; i < 4; i++)
if (node -> s[i] != NULL)
Delete(node -> s[i]);
delete node;
}
int main() {
int t;
string str1, str2;
scanf("%d", &t);
getchar();
while (t--) {
sum = 0;
getline(cin, str1);
getline(cin, str2);
len = str1.size();
i = -1;
Node* root1 = build(str1);
len = str2.size();
i = -1;
Node* root2 = build(str2);
dfs(root1, root2, 0);
printf("There are %d black pixels.\n", sum);
Delete(root1);
Delete(root2);
}
return 0;
}