题意:有一颗完全二叉树,小球自树上而向下滚落,每当小球滚过一个节点时,节点的方向开关便会被置反;
解题思路:由于是完全二叉树(k->left=2k,k->right=2k+1),可以将二叉树存储于数组中(模拟超时);每个小球都是由root向下滚落,开关的方向与这个小球处在第几次经过该节点有关,当小球标号为奇数I时,它是往左走的第(I+1)/2个小球,当I为偶数时,是往右走的第I/2个小球; 模拟小球路线;
#include<cstdio>
#include<cstring>
const int maxd = 20;
//int s[1<<maxd];
int main(){
int D,I,T;
scanf("%d",&T);
for(int j=0;j<=T;j++){
scanf("%d",&D);
if(D==-1) {
break;
}
scanf("%d",&I);
/* memset(s, 0, sizeof(s));
int k, n = (1<<D)-1;
for(int i = 0; i < I; i++){
k = 1;
for(;;){
s[k] = !s[k];
k = s[k] ? k*2 : k*2+1 ;
if(k>n) break;
}
}
printf("%d\n",k/2); */
int k = 1;
for(int i = 0; i < D-1; i++)
if(I%2) {
k=2*k;
I = (I+1)/2;
}else {
k = 2*k+1;
I/=2;
}
printf("%d\n",k);
}
return 0;
}