题目:
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次移动的是那一个盘子.
对于第一个盘子从第一次2^0开始,后面每次要等一个盘子移动完它就移动,也就是说1号盘子隔一个移动一次,即1,3,5,7...是它移动的顺序
对于第二个盘子从第二次2^1开始,需要等比它号码高的一个盘子移动后还要等比它号码低的盘子全部移动后才能移动,即2号要等1号移动完,需要等2^1+2^1=2^2次
即2号盘子每次移动的序号是2,6,10,14..
对于第3个盘子从2^2开始,同样需要等比它号码高的一个盘子移动后还要等比它号码低的盘子全部移动完后才能移动,即3号要等1,2号移动完才行,需要等2^1+2^2+2^1=2^3次
即3号盘子每次移动的序号是4,12,20...
后面的规律类似……代码如下:
#include
const int INF = 0x3f3f3f;
using namespace std;
const int MAX=10;
int main(){
__int64 n,m;
int i;//i必须声明为全局变量
while(cin>>n>>m && n + m)//n个盘子,第m次移动的是哪一个
{
for(i=1;i<=n;++i){
if(m%2)break;//如果m为奇数,输出1
m=m/2;//2号盘需要等2^2次,3号盘必须等2^3次,以此类推
}
cout<
<