您的位置:首页 > 其它

完全2叉树 小球下落 非模拟方法

2011-07-18 20:11 260 查看
#include<iostream>
#include<vector>
#include<cmath>
using std::vector;
using std::cin;
using std::cout;
using std::endl;
int main()
{
int iHeight = 0;
int iBallNum = 0;
long iNodeNum = 0;
int iCurIndex = 1;
while(cin>>iHeight && cin>>iBallNum)
{

iNodeNum = static_cast<long>(pow(2.0,iHeight) - 1);

iCurIndex = 1;
long lCurNodeBallNum = iBallNum - 1;//倒数第二次的开关状态,决定最后一次落向
for(int iLayer = 1; iLayer != iHeight; iLayer++)
{
if(lCurNodeBallNum % 2 ==0)// 该节点球落了iBallNum次,开关应该是初始状态关闭。左边孩子
{
iCurIndex = iCurIndex * 2;
lCurNodeBallNum = lCurNodeBallNum / 2; //落在左孩子上面球的次数
}
else //open
{
iCurIndex = iCurIndex * 2 + 1; //落在右边孩子上面的球次数
lCurNodeBallNum = lCurNodeBallNum / 2;

}
}

cout<<iCurIndex<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: