这题除了白书上的代码,自己YY了一种类似线段数区间操作的方法,一个结点4个孩子,
结点k,四个孩子编号分别为4*k+1,4*k+2,4*k+3,4*K+4,从零开始
读取的时候直接递归,所以代码也比较简洁。
/*jerryRey 转载请注明出处,谢谢 http://www.cnblogs.com/jerryRey/ */ #include<cstdio> #include<cstring> const int maxn = 1365 + 5;//4^5 + 4^4 + ... + 1 char s[maxn]; int tr[maxn]; int p; void add(int o) { char ch = s[p++];// if(ch == ‘p‘&&!tr[o]) { int no = o<<2; for(int i = 1; i <=4; i++) add(no+i); } else if(ch == ‘f‘) { tr[o] = 1; } } int w[] = {1024,256,64,16,4}; int query(int o,int l) { if(l == 5) return tr[o]; int ans = 0; if(!tr[o]){ int no = o<<2; l++; for(int i = 1; i <=4; i++) { ans += query(no+i,l); } } else { ans += w[l]; } return ans; } int main() { // freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { memset(tr,0,sizeof(tr)); for(int i = 0; i < 2; i++){ scanf("%s",s); p = 0; add(0); } printf("There are %d black pixels.\n",query(0,0)); } return 0; }
时间: 2024-10-22 21:27:27