二叉树之小球下落问题

来源:互联网 发布:golang json map 遍历 编辑:程序博客网 时间:2024/04/26 02:09

有一颗二叉树,最大深度为D,所有叶子的深度都相同。所有结点从上到下从左到右的编号分别依次是1,2,3,4,~,(2的D次方-1)。在节点1放下一个小球,它会往下落。每个内结点都有一个状态(开或关),初始时,每个内结点都处于关闭状态,当小球经过一个内结点时,开关状态会改变。当为开状态时,小球向左落下;当为关状态时,小球向下落下,直到走到叶子结点。

输出树的深度D,和小球数量I

输出第I个小球落到的结点编号

输入样例: 

4 2

3 4

2 2

16 12345

输出样例:

12

7

3

36358


分析:

每个小球都会落到结点上,只能往左或者往右,我们分析小球的奇偶性,发现:若小球编号是奇数,则是往左落下的第(I+1)/2个小球;若小球是偶数,则是往右落下的第I / 2个小球。以此判断来模拟最后一个小球的路线。

代码如下:

#include <stdio.h>#include <string.h>const int MAXD = 20;int main(){    int D,I;    while(scanf("%d%d",&D,&I)==2)    {        int i,k=1;        for(i=0;i<D-1;i++)        {            if(I%2)            {                k=k*2;                I=(I+1)/2;            }            else            {                k=k*2+1;                I=I/2;            }        }        printf("%d\n",k);    }    return 0;}


原创粉丝点击