Unity 汉诺塔Hannota笔记

汉诺塔游戏规则理解讲解视频推荐:有趣的汉诺塔游戏怎么玩?把大象放冰箱里一共分几步?_哔哩哔哩_bilibili

假设有A,B,C三个塔,A塔有N块原配,目标是把A盘的全部圆盘转移到C盘中,那么我们就需要把A塔顶部的N-1块盘转移到B盘,再将第N块盘从A塔转移到B塔,则完成所有移动。递归思想,把一个大的问题,不断分解成无数个小问题。

视频中的总结:

代码:

创建一个脚本 ,开始编写代码

想创建一个结构体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()记录下数据

  1. 然后回到第三步,此时,我们刚刚把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塔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值