汉诺塔基本介绍

  1. 有三根相邻的柱子A,B,C
  2. A柱子从上往下按照下大上小的顺序放着一些圆盘
  3. 把所有的圆盘移动到C柱子上,一次只能移动一个,B可以临时存放,每次移动时要保证下大上小的规则

image.png

分治法实现汉诺塔思路分析

最小规模

如果只有一个盘,A——>C

小的问题

假如我们有n>=2情况,我们总是可以看作是两个盘 ①最下面的盘,②上面的盘

  1. 先把上面的盘A——>B
  2. 把最下面的盘A——>C
  3. 把B塔的所有盘从B——>C

小问题是个递归的过程,很容易解决,我们要把大问题拆分成这样的小问题,再合并解

代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Text;
  7. namespace ConsoleApp1
  8. {
  9. class Program
  10. {
  11. public static int count = 0;
  12. static void Main(string[] args)
  13. {
  14. hanoiTower(30, 'A', 'B', 'C');
  15. Console.WriteLine("次数:"+count);
  16. }
  17. //汉诺塔移动的方法,使用分治算法
  18. public static void hanoiTower(int num,char a,char b,char c)
  19. {
  20. //如果只有一个盘
  21. if (num == 1)
  22. {
  23. //Console.WriteLine($"第1个盘从{a}——>{c}");
  24. count++;
  25. }
  26. else
  27. {
  28. //假如我们有n >= 2情况,我们总是可以看作是两个盘 ①最下面的盘,②上面的盘
  29. //1.先把上面的所有盘A——>B,移动过程中间使用C
  30. hanoiTower(num - 1, a, c, b);
  31. //2.把最下面的盘A——>C
  32. //Console.WriteLine($"第{num}个盘从{a}——>{c}");
  33. count++;
  34. //把B塔的所有盘从B——>C,移动过程中间借用A
  35. hanoiTower(num - 1, b, a, c);
  36. }
  37. }
  38. }
  39. }