题意:
又是看了半天才看题意懂系列,其实题目看明白就蛮好动手了,直接看图吧( • ̀ω•́ )✧
- 1 先是那一串英文: 'p’表示父节点,且为混色,因为只有叶结点会有两种颜色(黑or白,'e’表示白色,'f’表示黑色),字符串从左到右对应到四叉树的图中就是从上往下,从左往右的建树顺序。
- 2 再是那张图:表示,从根节点(大正方形),假如存在混色(方块中存在两种颜色的小方块),往下找叶结点(均分四块),顺序是按照图中所示。
- 3 最后是对应计算,总的像素为32*32,求两块大正方形合并后(黑+白=黑),黑色区域的像素值为多少。
思路:
从头遍历字符串,遇到’p’则递归,遇到’f’则标记并像素点加1,坐标选取的是从左上方开始。
#include<iostream>
#include<algorithm>
using namespace std;
char s[2000];
int maps[32][32];
int ans;
int t;
void dfs(int &t,int x,int y,int len)
{
char ch=s[t++];
if(ch=='p')
{
dfs(t,x,y+len/2,len/2);//1
dfs(t,x,y,len/2);//2
dfs(t,x+len/2,y,len/2);//3
dfs(t,x+len/2,y+len/2,len/2);//4
}
else if(ch=='f')
{
for(int i=x;i<x+len;i++)
{
for(int j=y;j<y+len;j++)
{
if(maps[i][j]==0)
{
maps[i][j]=1;
ans++;
}
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
ans=0;
memset(maps,0,sizeof(maps));
for(int j=0;j<2;j++)
{
scanf("%s",s);
t=0;
dfs(t,0,0,32);
}
printf("There are %d black pixels.\n",ans);
}
return 0;
}
总结:
1.对于这道题看懂图比看懂英文要快。
2.思维定势,看见树就哒哒哒建树,然后挺耗时耗力的,题目本身数据范围比较小,可以用递归去做。