球从二叉树上滚下 初始开关全部关闭 经过一个节点状态变 关:左走 open:右走 输出最后落在哪里
1 #include<cstdio>
2 #include<sctring>
3 int main()
4 {
5 while(scanf("%d%d",&d,&t)==2)
6 {
7 memset(s,0,sizeof(s));
8 int k,n=(1<<d)-1; //2^d-1: 最大节点编号
9 for(int i=0;i<t;i++)//让t个小球下落
10 {
11 k=1;
12 while(1)
13 {
14 s[k]=!s[k];//先改变状态 再反过来判断。
15 k=s[k]? k*2:k*2+1; //open 右走 guan 左走
16 if(k>n) break;
17 }
18 }
19 printf("%d\n",k/2);
20 }
21 return 0;
22 }
23
24 simplify
25 while (scanf("%d %d",&d,&t)==2)
26 {
27 int k=1;
28 for(int i=0;i<d-1;i++)
29 {
30 if(t%2==1) //ji 左子树
31 {
32 k*=2;
33 t=(t+1)/2;//看它是第几个落在左子树的 以此类推.... t是奇数时,它是往左走的第(t+1)/2个球
34 }
35 else//偶 右子树
36 {
37 k=k*2+1;
38 t/=2;
39 }
40 }
41 printf("%d\n",k);
42 }