题目63:猴子下落

来源:互联网 发布:jsp登陆界面源码 编辑:程序博客网 时间:2024/04/29 21:16

描述

有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3·····2D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。

一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?

输入

输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾

输出

输出第I个小猴子所在的叶子编号。

样例输入

4 2

3 4

0 0

样例输出

12

7

 

 

 

 

#include<iostream>

#include<math.h>

using namespace std;

int main(void)

{

   cout<<"请输入树的深度和猴子的个数(猴子个数小于树的深度):";

   int depth,count;

   cin>>depth>>count;

   int num=1;

   for(int i=1;i<depth;i++)

    {

       if(count%2==0)   //偶数

           num=num*2+1; //右子树

       else

           num=num*2; //奇数 左子树

       if(count==2)

           count/=2;

       else if(count==1)

           ;

       else

           count=ceil(count/2.0);  //向上取整 用2和2.0的区别

    }

   cout<<count<<' '<<num<<endl;

       return0;

}

 

 

 

  通过简单的图形模拟,我们可以看出规律:奇数向左,偶数向右。例如:输入的是4 3,

那么在第一层时,3是位于奇数的位数(3),则向左;

然后到了第二层,进入第二层左的只有1 和 3,所以,在这里,3位于偶数的位置(2),则向右;

然后到了第三层,进入第三层右的只有3 所以,在这里,3位于奇数的位置(1),则向左,到此结束。

 

再例如:输入的是3 4

      那么在第一层的时,4是位于偶数的位置(4),则向右;

      然后到了第二层,进入第二层的右的只有2和4,所以,在这里,4位于偶数的位置(2),则向右;

      然后到了第三层,进入第三层右的只有4,所以,在这里,4位于奇数的位置(1),则向左,到此结束。

 

      从以上示例可以看出,循环的次数就是树的深度减一;

      初始的想法是建立一棵完整的二叉树,但是后来发现,只要用一维数组模拟二叉树,然后运用一个法则:左子结点和其父母结点的关系是2*n;右子结点和其父母结点的关系是2*n+1.

      但是这里最大的问题就是对于一个数字当前所处位置是属于偶数位置还是奇数位置的判断:取当前值的一半,然后再向上取整的数…

0 0
原创粉丝点击