码迷,mamicode.com
首页 > 其他好文 > 详细

nyist题目63小猴子下落

时间:2015-02-17 15:13:31      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

小猴子下落

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述

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

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

 
输入
输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
输出
输出第I个小猴子所在的叶子编号。
样例输入
4 2
3 4
0 0
样例输出
12
7

 

 

 

 

第一感觉就是这题题目思路和清晰,一开始想到直接算出答案输出即可,考虑到正在学习数据结构,因此还是选择了用树写。

树写代码如下:

 1 #include<iostream>
 2 #include<queue>
 3 #include<cmath>
 4 using namespace std;
 5 struct node
 6 {
 7     int data;
 8     int flag;
 9     node *lchild,*rchild;
10     node();
11 };
12 node::node()
13 {
14     flag=-1;
15     rchild=lchild=NULL;
16 }
17 void createTree(int d,node *&root)
18 {
19     queue<node *> q;
20     while(!q.empty())
21         q.pop();
22     root=new node;
23     static int count=0;
24     root->data=++count;
25     q.push(root);
26     node *t=root;
27     while(count!=pow(2,d)-1)
28     {
29         t=q.front();
30         q.pop();
31         t->lchild=new node;
32         t->lchild->data=++count;
33         q.push(t->lchild);
34         t->rchild=new node;
35         t->rchild->data=++count;
36         q.push(t->rchild);
37     }
38     t=NULL;
39     count=0;
40 }
41 /*
42 void LevelOrder(node *root)
43 {    //队列实现
44     queue<node *> q;
45     node *t=root;
46     if(t!=NULL) q.push(t);                //根非空,入队
47     while(!q.empty())                //队不空
48     {
49         t=q.front();
50         q.pop();                    //出队
51         cout<<t->data<<" ";
52         if(t->lchild)
53             q.push(t->lchild);  //遍历左孩子
54         if(t->rchild)           
55             q.push(t->rchild); //遍历右孩子
56     }
57 
58 }
59 */
60 void Go(int &t,node *&root)
61 {
62     if(root->lchild&&root->rchild){
63     if(root->flag==-1)
64     {
65         Go(t,root->lchild);
66         root->flag=1;
67     }
68     else
69     {
70         Go(t,root->rchild);
71         root->flag=-1;
72     }
73     }
74     else
75         t=root->data;
76 }
77 
78 int main()
79 {
80     int d,num;
81     while(cin>>d>>num,d&&num){
82     node *root=NULL;
83     createTree(d,root);
84     int t;
85     for(int i=0;i<num;i++)
86         Go(t,root);
87     cout<<t<<endl;
88     }
89 return 0;
90 }

 

AC后看了下最优解法,果然是直接输出,标答如下:

 1  
 2 #include<iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int d,i,k;
 8     while(cin>>d>>i && (d+i) !=0)
 9     {
10         k=1;
11         for (int j=0;j<d-1;j++)
12             if(i%2) {k=k*2;i=(i+1)/2;}
13             else {k=k*2+1;i /=2;}
14         cout<<k<<endl;
15 
16     }
17 }        

 

nyist题目63小猴子下落

标签:

原文地址:http://www.cnblogs.com/ljwTiey/p/4295202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!