汉诺塔基本介绍
- 有三根相邻的柱子A,B,C
- A柱子从上往下按照下大上小的顺序放着一些圆盘
- 把所有的圆盘移动到C柱子上,一次只能移动一个,B可以临时存放,每次移动时要保证下大上小的规则
分治法实现汉诺塔思路分析
最小规模
小的问题
假如我们有n>=2情况,我们总是可以看作是两个盘 ①最下面的盘,②上面的盘
- 先把上面的盘A——>B
- 把最下面的盘A——>C
- 把B塔的所有盘从B——>C
小问题是个递归的过程,很容易解决,我们要把大问题拆分成这样的小问题,再合并解
代码
using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Runtime.Serialization.Formatters.Binary;using System.Text;namespace ConsoleApp1{class Program{public static int count = 0;static void Main(string[] args){hanoiTower(30, 'A', 'B', 'C');Console.WriteLine("次数:"+count);}//汉诺塔移动的方法,使用分治算法public static void hanoiTower(int num,char a,char b,char c){//如果只有一个盘if (num == 1){//Console.WriteLine($"第1个盘从{a}——>{c}");count++;}else{//假如我们有n >= 2情况,我们总是可以看作是两个盘 ①最下面的盘,②上面的盘//1.先把上面的所有盘A——>B,移动过程中间使用ChanoiTower(num - 1, a, c, b);//2.把最下面的盘A——>C//Console.WriteLine($"第{num}个盘从{a}——>{c}");count++;//把B塔的所有盘从B——>C,移动过程中间借用AhanoiTower(num - 1, b, a, c);}}}}
