今天在网上看到一个非常nb的汉诺塔解法——二进制计数。
- 举个例子:有8个盘子,从小到大编号为0-7,分别对应8位二进制数的低到高位。我们会惊奇地发现,每次移动0号盘子,二进制最低位就会变成1(加1),在移动1号盘子时,倒数第二位就会变成1……以此类推,能得出二进制进位与移动盘子次数相对应的话,从低位开始最早出现1的那一位编号(digit),就对应当前移动盘子的编号。加上例题和代码帮助理解:
Problem Description:
问第m次移动的是那一个盘子.
Input:
每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1.n=m=0退出.
63 1
63 2
0 0
Ouput:
输出第m次移动的盘子的号数.
1
2
#include<iostream>
using namespace std;
int main()
{
long long n,m;
while(cin>>n>>m&&n&&m)
{
int temp,p=0;
while(m!=0)
{
temp=m%2;
m=m/2;
p++;
if(temp==1) break;
}
cout<<p<<endl;
}
return 0;
}