当前位置: 代码迷 >> 综合 >> [汉诺塔][第二阶段-汉诺塔入门][HDOJ-2175]汉诺塔IX
  详细解决方案

[汉诺塔][第二阶段-汉诺塔入门][HDOJ-2175]汉诺塔IX

热度:76   发布时间:2023-12-07 23:59:27.0
Problem 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次移动的是那一个盘子.


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


这题之前纠结了好久。本来有一个版本成功了 但是m忘记改成long结果wa了。。。。

贴一版好理解的 精简的代码吧。 规律还挺好找的

对于第一个盘子从第一次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...

....

后面同样的规律



import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);int i;int n = in.nextInt();long m = in.nextLong();while(n!=0&&m!=0){for(i=1;i<=n;i++){if(m%2!=0)break;m/=2;}System.out.println(i);n = in.nextInt();m = in.nextLong();}}
}

??