MENU

奇怪的汉诺塔

February 19, 2019 • Read: 3414 • 算法阅读设置

首先打表出只有三根柱子时 1~12 个圆盘所需的次数,思路是这样的,对于三根柱子,首先将前 i-1 个圆盘移动到某一根柱子,然后将最后一个圆盘移动到一根柱子,最后再将剩下的 i-1 个圆盘移动到一根柱子,所以 three[i] = three[i - 1] + 1 + three[i - 1]

对于四根柱子来说,枚举前 j 个圆盘,首先将前 j 个圆盘移动到四根柱子种的某一根,次数是 four[j],然后将剩下的 i-j 个圆盘移动到剩下的三根柱子,次数是 three[i-j](为什么是三根柱子,因为之前已经有一根柱子被占用了,所以这里即使有四根柱子,也只有三根能用),最后再将那 j 个圆盘移回来,次数是 four[j],所以状态转移方程为 four[i] = min{four[i], four[j] + three[i - j] + four[j]}

  • import java.util.Arrays;
  • import java.util.Scanner;
  • public class Main {
  • public static void main(String[] args) {
  • Scanner cin = new Scanner(System.in);
  • int[] three = new int[13];
  • for (int i = 1; i <= 12; i++)
  • three[i] = three[i - 1] + 1 + three[i - 1];
  • int[] four = new int[13];
  • Arrays.fill(four, Integer.MAX_VALUE >> 1);
  • four[0] = 0;
  • for (int i = 1; i <= 12; i++)
  • for (int j = 0; j < i; j++)
  • four[i] = Math.min(four[i], four[j] + three[i - j] + four[j]);
  • for (int i = 1; i <= 12; i++)
  • System.out.println(four[i]);
  • }
  • }
Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment