小猴子下落
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。
一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?
有关二叉树的知识:有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。 当前结点编号为n,则其左孩子为2n,右孩子为2n+1.
在此题中,若输入第n个小猴子,若n为奇数,向左走一个结点,再对n处理,n=(n+1)/2,表示小猴子是当前结点的第n个到达者,计数器k,k=k*2,表示当前结点的编号(原因参照第一句知识)。若n为偶数,向右走一个结点,再对n处理,n=n/2,表示小猴子是当前结点的第n个到达者,计数器k,k=k*2+1,表示当前结点的编号(原因参照第一句知识)。
#include<stdio.h>
int main(){
int n,m,k,i;
while(~scanf("%d%d",&n,&m)&&n||m){
k=1;
for(i=0;i<n-1;i++){//如果i从1开始,时间为4,为了时间小一点,还是从0开始吧
if(m%2){//奇数,向左
k=k*2;
m=(m+1)/2;//第几个到此位置的
}
else{//偶数,向右
k=k*2+1;
m=m/2;//第几个到此位置的
}
}
printf("%d\n",k);
}
return 0;
}