• 汉诺塔(移动方案)


    问题描述

    设有3个分别命名为X、Y和Z的塔座,在塔座X上有n个直径各不相同的盘片,从小到大一次编号为1、2、..n。现要求将X塔座上的这n个盘片移到塔座Z上并仍按同样的顺序叠放,盘片移动时必须遵守一下规则:每次只能移动一片盘片;盘片可以插在X、Y和Z中的任一塔座上;任何时候都不能将一个较大的盘片放在较小的盘片上。

    思路

    采用递归求解。将n个盘片从X移到Y,等同于先将n-1个从X移到Z(从小到大叠放),然后将剩下的一个移动到Y,再将原来的n-1个从Y移到Z。

    剩下的一个总是最大的,所以不会违反规则。最大的到达目的地后,可直接忽略掉,问题规模就减少1了。

    代码

     1 #include<stdio.h>
     2 
     3 //表示将n个盘片从X塔座,借助Y塔座,移动到Z塔座
     4 void Hanoil(int n, char X, char Y, char Z)
     5 {
     6     if (n == 1)
     7         printf("	将第%d个盘片从%c移动到%c
    ", n, X, Z);
     8     else
     9     {
    10         Hanoil(n - 1, X, Z, Y);
    11         printf("	将第%d个盘片从%c移动到%c
    ", n, X, Z);
    12         Hanoil(n - 1, Y, X, Z);
    13     }
    14 }
    15 
    16 int main()
    17 {
    18     int n;
    19     char names[] = { 'X','Y','Z' };
    20     printf("盘片的个数:");
    21     scanf("%d", &n);
    22     Hanoil(n, names[0], names[1], names[2]);
    23 
    24     return 0;
    25 }
  • 相关阅读:
    ARPG手游实战练习(八)
    ARPG手游实战练习(七)
    ARPG手游实战练习(六)
    ARPG手游实战练习(五)
    ARPG手游实战练习(四)
    ARPG手游实战练习(三)
    C# Array类的Sort()方法
    C#继承讲解以及对象的创建
    单例模式
    愤怒的小鸟(练习版)
  • 原文地址:https://www.cnblogs.com/lfri/p/9890406.html
Copyright © 2020-2023  润新知