tree


球从二叉树上滚下 初始开关全部关闭 经过一个节点状态变 关:左走 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 }

 

posted on 2016-03-22 00:22  babyyang  阅读(144)  评论(0编辑  收藏  举报