题意:有棵二叉树,每次小球从根节点下落到叶子节点停止,条件:当经过每个节点时会发生一种状态,开始变为关闭,关闭变为开始,如果当前为关闭将向左走,否则向右走。问第I个下落到叶子节点的编号?
思路:当I为奇数时,计算编号:k*2,它往左走的第(I+1)/2个小球,当偶数时,计算编号:k*2+1 ,它是往右走的第I/2个小球;
这题不太懂这思路!
参考:入门经典-例6-6-P150
代码:
#include <iostream>
using namespace std;
int main()
{
int n,D,I;
while(cin >> n && n != -1)
{
while(n--)
{
int k=1;
cin >> D >> I;
for(int i=0;i<D-1;i++)
{
if(I%2)
k *= 2,I = (I+1)/2;
else
k = 2*k + 1,I /= 2;
}
cout << k << endl;
}
}
return 0;}