汉诺塔游戏规则理解讲解视频推荐:有趣的汉诺塔游戏怎么玩?把大象放冰箱里一共分几步?_哔哩哔哩_bilibili
假设有A,B,C三个塔,A塔有N块原配,目标是把A盘的全部圆盘转移到C盘中,那么我们就需要把A塔顶部的N-1块盘转移到B盘,再将第N块盘从A塔转移到B塔,则完成所有移动。递归思想,把一个大的问题,不断分解成无数个小问题。
视频中的总结:
![](https://img-blog.csdnimg.cn/img_convert/3c78d039b570a488976f98277bbfbb9b.png)
代码:
创建一个脚本 ,开始编写代码
想创建一个结构体MoveStep 为我们后面使用列表来记录结果
public struct MoveStep
{
public int diskindex;//当前圆盘的索引,自上而下:n->0
public string from;//起始位置
public string to;//目标位置
public MoveStep(int index,string fromPole,string toPole)//结构体赋值
{
diskindex = index;
from = fromPole;
to = toPole;
}
//ValueType.ToString()为系统默认函数 若要重写要使用override关键字
public override string ToString()
{
return $"[{diskindex}] {from}->{to}";
}
}
定义一个接口来规范我们类的行为
//接口定义协定,规范类的行为
//实现该协定的任何class或struct 必须提供接口中定义的成员实现。接口可以为成员定义默认实现
public interface ISolve
{
List<MoveStep> Solve(int disNum);
}
最后在类中定义函数,递归。
关于Move(int index,string form,string to,string by)函数
如果该盘的索引(从0开始)为total-1时 ,即为最小盘的时候,递归结束点,将该结果from(起始塔的位置),to(目的地塔的位置)记入下来
Move(index+1,from,by,to):若我们想要移动第index盘,那么我们首先需要将index+1盘移动到by的位置,因为index盘需要移动到to的位置
data.Add(new MoveStep(index,from,to))将index+1盘从from移动到by之后,我们就需要将index盘从from移动to盘,将结果记入下来
Move(index+1,by,to,from);之前我们将index+1盘移动到了by,现在我们就需要将index+1盘从by移动回to盘
public class Demo1 : ISolve
{
int total ;//盘的总数
List<MoveStep> data = new List<MoveStep>();//定义链表 记录数据
public List<MoveStep> Solve(int disNum)
{
data.Clear();
total = disNum;
Move(0, "A", "C", "B");
return data;
}
void Move(int index,string from,string to ,string by)
{
if(index==total-1)
{
data.Add(new MoveStep(index, from, to));
return;
}
Move(index + 1, from, by, to);
data.Add(new MoveStep(index, from, to));
Move(index+1, by, to, from);
}
eg,一共三个盘,三个塔A,B,C
1.首先Move(0,"A","C","B");我们想要y将最底下,最大的盘(0)从A移动到C
2.然后我们发现想要移动0号盘,那么我首先需要将0号盘上面的盘从A移动到B塔先,所以再次调用函数Move(0+1,"A","B","C");
3.然后我们又发现想要移动1号盘,我们需要先把1号盘上的2号盘给移动了先,因为1号盘需要移动到B的位置,所以我们需要将2号盘放到C塔,再次调用函数,Move(1+2,"A","C","B")
4.此时 2=total-1 ,因为2号盘是最小盘,所以直接将2号盘移动到C塔,使用data.Add()记录下数据
然后回到第三步,此时,我们刚刚把2号盘移动到C塔,所以我们可以把1号盘移动到B塔
6.我们再将2号盘移动回B塔Move(1+1,"C","B","A")
7.回到2步,此时我们可以移动0号盘,data.add(new MoveStep(0,"A","C"))
8.此时我们要将1号盘从B塔移动到C塔,Move(0+1,"B","C","A");然后发现想要移动1号盘就得移动2号盘
以此类推,总结,但我们想要将0号盘移动到C塔时,我们首先需要将n盘上的所有盘移动到B塔,然后将0号盘移动到C塔,再将B塔上的所有盘移动到C塔。