题意是用字符串描述的一棵四叉树,读取字符串获得最终叶子节点的颜色。输入是2个字符串,根据这2个字符串建立2个四叉树。然后对于,指定位置的叶子节点,如果2颗树的叶子颜色其中一个为黑色,那么ans++,输出的就是ans。
类似树形结构的东西,直接一个函数递归求解即可。函数参数,一般是字符串地址,当前位置,然后还有其它在递归时候需要用到的东西。
代码如下:
1 #include <stdio.h>
2 #define BLACK (1)
3 #define WHITE (2)
4 #define MAX (32)
5 int nStateA[MAX][MAX];
6 int nStateB[MAX][MAX];
7
8 char szOne[10000];
9 char szTwo[10000];
10
11 void GetState(int nState[MAX][MAX], char* pszLine, int& nPos,
12 int nSize, int nX, int nY)
13 {
14 if (pszLine[nPos] == 'p')
15 {
16 ++nPos;
17 GetState(nState, pszLine, nPos, nSize / 2, nX + nSize / 2, nY);
18 GetState(nState, pszLine, nPos, nSize / 2, nX, nY);
19 GetState(nState, pszLine, nPos, nSize / 2, nX, nY + nSize / 2);
20 GetState(nState, pszLine, nPos, nSize / 2, nX + nSize / 2, nY + nSize / 2);
21 }
22 else
23 {
24 for (int i = nX; i < nX + nSize; ++i)
25 {
26 for (int j = nY; j < nY + nSize; ++j)
27 {
28 if (pszLine[nPos] == 'e')
29 {
30
31 nState[i][j] = WHITE;
32 }
33 else
34 {
35 nState[i][j] = BLACK;
36 }
37 }
38 }
39 ++nPos;
40 }
41 }
42
43 int main()
44 {
45 int nCases;
46
47 scanf("%d\n", &nCases);
48 while (nCases--)
49 {
50 gets(szOne);
51 gets(szTwo);
52 int nPos = 0;
53 GetState(nStateA, szOne, nPos, MAX, 0, 0);
54 nPos = 0;
55 GetState(nStateB, szTwo, nPos, MAX, 0, 0);
56 int nAns = 0;
57
58 for (int i = 0; i < MAX; ++i)
59 {
60 for (int j = 0; j < MAX; ++j)
61 {
62 if (nStateA[i][j] == BLACK || nStateB[i][j] == BLACK)
63 {
64 nAns++;
65 }
66 }
67 }
68 printf("There are %d black pixels.\n", nAns);
69 }
70
71 return 0;
72 }
73