汉诺塔基本介绍
- 有三根相邻的柱子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,移动过程中间使用C
hanoiTower(num - 1, a, c, b);
//2.把最下面的盘A——>C
//Console.WriteLine($"第{num}个盘从{a}——>{c}");
count++;
//把B塔的所有盘从B——>C,移动过程中间借用A
hanoiTower(num - 1, b, a, c);
}
}
}
}