题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2175
题目描述:
输出汉诺塔问题中第m次移动的盘子编号
解题思路:
没想到这系列竟然一共十道题,好吧~这一定是最⑨的一道。但是想了一阵,解法就是。。写一个4个盘子的出来
我们的移动依次是:
1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
你看多有规律。。不难发现隐藏着某种“规律性增加”的关系。
具体解法就是像我代码那样,应该很好懂了。
AC代码:
#include <iostream>
#include <cstring>
typedef long long ll;
using namespace std;
ll ans[70];
ll hanoi(int n)
{
if(n==1)
return 1;
return 2*hanoi(n-1)+1;
}
int main()
{
int i,n;
ll m;
for(i=1;i<=63;i++)
{
ans[i]=hanoi(i);
//cout<<ans[i]<<endl;
}
while(cin>>n>>m,n||m)
{
for(i=63;i>=1;i--)
{
if(m-ans[i]==0)
{
cout<<1<<endl;
break;
}
if(m-ans[i]==1)
{
cout<<i+1<<endl;
break;
}
if(m-ans[i]>1)
m=m-ans[i]-1;
}
}
return 0;
}
AC截图: