汉诺塔问题总结(2)

今天在网上看到一个非常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;	
}

猜你喜欢

转载自blog.csdn.net/weixin_45688536/article/details/105327328