• 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#搞事情了(真香啊)

  • 相关阅读:
    团队作业9——测试与发布(Beta版本)
    团队作业8 ----第二次项目冲刺(Beta阶段)博客汇总
    【Beta】 第七次Daily Scrum Meeting
    【Beta】 第六次Daily Scrum Meeting
    【Beta】 第五次Daily Scrum Meeting
    【Beta】 第四次Daily Scrum Meeting
    【Beta】 第三次Daily Scrum Meeting
    Flask-论坛开发-5-memcached缓存系统
    Flask-论坛开发-4-知识点补充
    Flask-论坛开发-3-数据库
  • 原文地址:https://www.cnblogs.com/woshilxcdexuesheng/p/13290339.html
Copyright © 2020-2023  润新知