zoukankan      html  css  js  c++  java
  • 3柱河内塔问题的一种解释

    直接进入正题.今有3个柱子A,B,C.A柱子上有n个大小不同的盘子,且从上到下盘子从小到大.要把所有的A柱子上的盘子移动到C柱子.

    移动盘子可以借助B柱子,但是要求每次只能移动1个盘子,且整个移动过程中大盘子总是要在小盘子的下面.

    图1.河内塔问题

    如果只有1个盘子,结论是显然的.A移到C即可.

    如果有n个盘子(n>=2),结论不显然,需要化简些.

    先把n-1个盘子从A移动到B,借助C.(不必知道具体是怎么移动的,反正我做到了.)

    再把最大的盘子从A移动到C.

    然后把B柱子的n-1个盘子移动到C,借助A.(同样的,不必知道具体是怎么移动的,反正我做到了.)

    于是我们把n个盘子的问题转化为了2个n-1个盘子的问题.

    接着对每个(n-1个盘子的)问题操作下去,可以得到4个(n-2个的盘子的)问题.

    最后可以化为若干(2的n-1次方)个 显然的 1个盘子的问题.

    由等比数列求和可以看出,一共需要2的n次方-1次操作.

    全文的最后,发下(解决3个盘子的)代码吧:(C# .netcore 3.1)

     1 using System;
     2 namespace Hanoi {
     3     public static class Program {
     4 
     5         public static int Main(string[] args) {
     6             Hanoi(3, 'a', 'b', 'c');
     7             return 0;
     8         }
     9         public static void Hanoi(int k,char @from,char via,char to) {
    10             if(k == 1) {
    11                 Console.WriteLine($"{k}:{from}->{to}");
    12             }
    13             else {
    14                 Hanoi(k - 1, @from, to, via);
    15                 Console.WriteLine($"{k}:{from}->{to}");
    16                 Hanoi(k - 1, via, @from, to);
    17             }
    18         }
    19     }
    20 }

    p.s. 由于微软宣布不再给VB.NET提供新功能,后面就都用C#搞事情了(真香啊)

  • 相关阅读:
    Java集合类总结 (三)
    Java集合类总结 (二)
    Java集合类总结 (一)
    发布方配ASP.NET网站服务器
    Ubuntu重启搜狗输入法
    常用期刊检索
    latex 写大论文图目录中图注过长解决方案
    understanding backpropagation
    Ubuntu安装Adobe Reader
    【转】pdf文件自动切白边
  • 原文地址:https://www.cnblogs.com/woshilxcdexuesheng/p/13290339.html
Copyright © 2011-2022 走看看