【本题目发现一个神奇的错误,下面代码中有注释】
说明:如果把str数组定义在vis数组后的话,交到vj会报错,听高手说,这个定义顺序不同可能会导致分配内存不同,如果把str定义在vis后的话,我尝试把maxn的大小改大些就过了。
/*
该程序代码参考刘汝佳《算法竞赛入门经典》(第2版)
思路:本题目的四分树,每个结点要么有四个孩子要么没有孩子。用给定的先序序列递归建立
四叉树,即递归建立四边形(最外层边长为32,依次往内层是16,8,4,2,1)。两个字符串
建立两次,边建立,边统计,注意vis防止重复累计黑色小块块。
*/
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=32*32+50;
const int len=32;
char str[maxn];
bool vis[len][len];
//char str[maxn];如果str字符串在这里定义的话,vj会报错,真是奇葩错误???
int cnt;
int T;
void dfs(const char *s,int &p,int r,int c,int w){
int ch=s[p++];
if(ch=='p'){
dfs(s,p,r,c,w/2);
dfs(s,p,r,c+w/2,w/2);
dfs(s,p,r+w/2,c,w/2);
dfs(s,p,r+w/2,c+w/2,w/2);
}
else if(ch=='f'){
for(int i=r;i<r+w;i++){
for(int j=c;j<c+w;j++){
if(!vis[i][j]){
vis[i][j]=1;
cnt++;
}
}
}
}
}
int main()
{
cin>>T;
while(T--){
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<2;i++){
cin>>str;
int p=0;
dfs(str,p,0,0,32);
}
cout<<"There are "<<cnt<<" black pixels."<<endl;
}
return 0;
}