http://acm.hust.edu.cn/vjudge/contest/view.action?cid=76447#problem/E
汉诺塔IX Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.
在第1根柱子上的盘子是a[1],a[2],...,a[n]. a[1]=n,a[2]=n-1,...,a[n]=1.即a[1]是最下
面的盘子.把n个盘子移动到第3根柱子.每次只能移动1个盘子,且大盘不能放在小盘上.
问第m次移动的是那一个盘子.
在第1根柱子上的盘子是a[1],a[2],...,a[n]. a[1]=n,a[2]=n-1,...,a[n]=1.即a[1]是最下
面的盘子.把n个盘子移动到第3根柱子.每次只能移动1个盘子,且大盘不能放在小盘上.
问第m次移动的是那一个盘子.
Input
每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1.n=m=0退出
Output
输出第m次移动的盘子的号数.
Sample Input
63 1
63 2
0 0
Sample Output
1
2
看了,1个小时? 后悔没有坚持,后悔没有把想到的都想到,后悔,存在~代码超级简单
:
#include<stdio.h>
int main()
{
long long n, m, k; // 2的63次方,超过int类型范围
while(scanf("%lld%lld", &n, &m), n+m)
{
k = 1;
while(m % 2 != 1)
{
k++;
m /= 2;
}
printf("%lld ", k);
}
return 0;
}
int main()
{
long long n, m, k; // 2的63次方,超过int类型范围
while(scanf("%lld%lld", &n, &m), n+m)
{
k = 1;
while(m % 2 != 1)
{
k++;
m /= 2;
}
printf("%lld ", k);
}
return 0;
}
之前推了前几个:前5个顺序应该是 1 21 3121 4121 3121 5121 3121 4121 3121 。
看出来什么了吗没有,昨天其实都想到4放哪个柱子上的问题,由于什么,就把4按放第三个柱子上处理,5就变成了51213121312141213121,当n等于4的时候放第四个柱子上,当n等于5的时候,4放哪个柱子上都是一样,但5就不一样了。。醉了,脑子就那么一闪,就过去了。不过也不一定就能想出来。。