`
橡树心
  • 浏览: 48199 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

双色,三色河内塔(Hanoi2Colors)

阅读更多
问题说明:

       双色,三色河内塔是由河内塔演变而来的一种算法。
public class Hanoi2Colors { 
    public static void help() {
        System.out.println(
              "Usage: java Hanoi2Colors number_of_disks");
        System.out.println(
              "\t number_of_disks: must be a even number.");
        System.exit(0);
    }
    
    public static void main(String[] args) {
        int disks = 0;        
        try {
            disks = Integer.parseInt(args[0]);
        } catch (Exception e) {
            help();
        }
        if ((disks <= 0) || (disks % 2 != 0)) { 
            help(); 
        }
        hanoi2colors(disks);
    }
     
    public static void hanoi(int disks, 
                      char source, char temp, char target) {
        if (disks == 1) {
            System.out.println("move disk from " 
                               + source + " to " + target);
            System.out.println("move disk from " 
                               + source + " to " + target);
        } else {        
            hanoi(disks-1, source, target, temp);
            hanoi(1, source, temp, target);
            hanoi(disks-1, temp, source, target);
        }
    }

    public static void hanoi2colors(int disks) {
        char source = 'A';
        char temp = 'B';
        char target = 'C';
        for (int i = disks / 2; i > 1; i--) {
            hanoi(i-1, source, temp, target);
            System.out.println("move disk from " 
                                   + source + " to " + temp);
            System.out.println("move disk from " 
                                   + source + " to " + temp); 
            hanoi(i-1, target, temp, source);
            System.out.println("move disk from " 
                                   + temp + " to " + target);
        }
        System.out.println("move disk from " 
                                   + source + " to " + temp);
        System.out.println("move disk from " 
                                 + source + " to " + target);
    }
} 





三色河内塔

public class Hanoi3Colors {    
    public static void help() {
        System.out.println(
              "Usage: java Hanoi3Colors number_of_disks");
        System.out.println(
      "\tnumber_of_disks: must be a number divisible by 3.");
        System.exit(0);
    }
    
    public static void main(String[] args) {
        int disks = 0;        
        try {
            disks = Integer.parseInt(args[0]);
        } catch (Exception e) {
            help();
        }
        if ((disks <= 0) || (disks % 3 != 0)) { 
            help(); 
        }
        hanoi3colors(disks);
    }
    
    public static void hanoi(int disks, 
                       char source, char temp, char target) {
        if (disks == 1) {
            System.out.println("move disk from " 
                               + source + " to " + target);
            System.out.println("move disk from "
                               + source + " to " + target);
            System.out.println("move disk from "
                               + source + " to " + target);
        } else {        
            hanoi(disks-1, source, target, temp);
            hanoi(1, source, temp, target);
            hanoi(disks-1, temp, source, target);
        }
    }
    
    public static void hanoi3colors(int disks) {
        char source = 'A';
        char temp   = 'B';
        char target = 'C';
        if (disks == 3) {
            System.out.println("move disk from " 
                            + source + " to " + temp);
            System.out.println("move disk from " 
                            + source + " to " + temp);
            System.out.println("move disk from " 
                            + source + " to " + target);
            System.out.println("move disk from " 
                            + temp + " to " + target);
            System.out.println("move disk from " 
                            + temp + " to " + source);
            System.out.println("move disk from " 
                            + target + " to " + temp);
        } else {
            hanoi(disks/3-1, source, temp, target);
            System.out.println("move disk from " 
                            + source + " to " + temp);
            System.out.println("move disk from " 
                            + source + " to " + temp);
            System.out.println("move disk from " 
                            + source + " to " + temp);
            hanoi(disks/3-1, target, temp, source);
            System.out.println("move disk from " 
                            + temp + " to " + target);
            System.out.println("move disk from "
                            + temp + " to " + target);
            System.out.println("move disk from "
                            + temp + " to " + target);
            hanoi(disks/3-1, source, target, temp);
            System.out.println("move disk from " 
                            + target + " to " + source);
            System.out.println("move disk from " 
                            + target + " to " + source);
            hanoi(disks/3-1, temp, source, target);
            System.out.println("move disk from " 
                            + source + " to " + temp);
        
            for (int i = disks / 3 - 1; i > 0; i--) {
                if (i>1) { 
                    hanoi(i-1, target, source, temp); 
                }
                System.out.println("move disk from " 
                         + target + " to " + source);
                System.out.println("move disk from " 
                         + target + " to " + source);
                if (i>1) { 
                    hanoi(i-1, temp, source, target); 
                }
                System.out.println("move disk from " 
                         + source + " to " + temp);
            }
        }
    }
}

分享到:
评论
1 楼 namelessmyth 2009-06-27  
我来顶你啦,哈哈.

相关推荐

    双色Hanoi塔问题参考代码

    ### 双色汉诺塔问题解析与参考代码详解 #### 问题背景 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,起源于一个古老的印度传说。传说中,寺庙中的僧侣们需要将64个金盘从一个塔座移动到另一个塔座上,中间可以...

    hutc-双色Hanoi塔问题 参考代码

    ### hutc-双色Hanoi塔问题参考代码详解 #### Hanoi塔问题简介 汉诺塔(Hanoi Tower)问题是一种经典的递归算法问题,在计算机科学领域被广泛用于教授递归概念。传统的汉诺塔问题涉及到三个柱子及不同大小的盘子,...

    双色Hanoi塔问题

    各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则(1):每次只能移动1个...

    C经典算法之双色汉诺塔

    - 调用`hanoi2colors(n)`执行双色汉诺塔算法。 #### 总结 通过上述分析可以看出,双色汉诺塔是在传统汉诺塔的基础上加入了颜色限制,使得问题变得更加复杂。在实现过程中,我们利用了递归的思想来解决这一问题,...

    C经典算法之三色汉诺塔

    主函数用于接收用户输入的盘子数量 `n`,然后调用 `hanoi3colors(n)` 函数来执行三色汉诺塔的计算。 #### 总结 三色汉诺塔问题是在传统汉诺塔基础上的一种扩展,增加了对盘子颜色的考虑,使得问题的解决变得更加...

    C语言河内塔游戏源码1.2

    《C语言实现的河内塔游戏源码解析》 河内塔游戏,源自一个古老的印度传说,是一项典型的递归问题,常被用作教授计算机科学中的递归算法。本篇将详细解读用C语言编写的河内塔游戏源码,帮助读者理解其背后的逻辑和...

    河内塔问题的非递归解法

    在提供的压缩包文件"**HanoiTower**"中,可能包含了实现非递归算法的代码示例,你可以进一步学习和研究这些代码,以便更好地掌握非递归解决河内塔问题的方法。通过实践和调试,你将能够更加熟练地运用这种方法来解决...

    双色Hanoi塔C代码

    双色汉诺塔(Two-color Hanoi Tower)是汉诺塔问题的一个变体,与经典的汉诺塔游戏相比,它引入了两种不同颜色的盘子,使得规则有所变化。在这个游戏中,有两个目标柱子和一个辅助柱子,盘子有两种颜色:红色和蓝色...

    hanoi塔问题 hanoi塔问题

    set @startDate = cast(@year as char(4)) + '-' + cast(@month as char(2)) + '-1' set @endDate = cast(@year as char(4)) + '-' + cast(@month + 1 as char(2)) + '-1' select datediff(day, cast(@startDate ...

    C语言河内塔游戏源码

    `hanoi`函数是实现河内塔问题的核心,它接收三个参数,分别代表起始柱、目标柱和辅助柱。通过递归调用自身,我们可以将所有圆盘从起始柱移动到目标柱,每次移动一个圆盘,并利用辅助柱来暂存圆盘。 递归过程的基本...

    双色Hanoi塔问题 对于给定的正整数n,编程计算最优移动方案

    ### 双色汉诺塔问题解析 #### 一、问题背景与定义 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,在计算机科学领域有着广泛的应用价值。传统的汉诺塔问题设定三个塔座(A、B、C),并有n个大小不一的圆盘初始...

    hanoi-towers:很酷的河内塔算法可视化

    河内塔算法使用Canvas用Vanilla Javascript编写的酷河内塔算法可视化工具现场演示:什么是河内塔河内塔是一个问题,您需要移动由尺寸减小的磁盘制成的塔。 您有一个额外的塔可以使用。 唯一的规则是您不能将较大尺寸...

    河内塔demo

    汉诺塔(Hanoi Tower)是一个经典的递归问题,源于19世纪的法国数学家爱德华·卢卡斯提出的一个益智游戏。这个游戏中有三根柱子和一堆大小不一的圆盘,目标是将所有圆盘从第一根柱子(起始柱)移动到第三根柱子...

    汉诺塔河内塔源码C#

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自法国数学家爱德华·卢卡斯在19世纪末提出的数学问题。在这个游戏中,玩家需要将一堆按照大小顺序排列的圆盘从一个柱子移动到另一个柱子,遵循三个基本规则:每次...

    汉诺塔java源码-Towers-of-Hanoi:河内塔拼图项目

    汉诺塔java源码河内塔 嗨,这是一个用 Java 编写的简单 GUI 应用程序,用于演示如何以最少的步骤数(即 2 n -1 步)解决难题。 源代码在 Towers-of-Hanoi/src/src/towersofhanoi/ 它由两个类组成, 基本GUI.java ...

    汉诺塔 hanoi C代码

    汉诺塔游戏是一种经典的递归问题,源自印度的古老传说,通常用三根柱子(A、B、C)和一堆大小不一的圆盘来表示。在这个游戏中,目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,并且任何时候大盘子都...

    python编程小游戏汉诺塔hanoi

    这是使用python语言编程的小游戏,汉诺塔hanoi,欢迎大家下载

    汉诺塔java源码-TowersOfHanoi:河内塔

    2:河内塔 描述: 基于第 3 章,编程问题 12 游戏河内塔由三个钉子和一组堆叠在钉子上的戒指组成。 戒指大小不一。 此处显示了五环游戏的初始配置,第一个塔的环从一英寸(在顶部)到五英寸(在底部)。 河内塔 圆环...

    汉诺塔 (hanoi) c++

    汉诺塔(Hanoi Tower)是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的圆盘。问题的目标是将所有圆盘从一个柱子(通常称为起始柱或A柱)移动到另一个柱子(目标柱或C柱),但每次只能移动一个圆盘,并且...

    最新最精彩汉诺塔HanoiTower

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪法国数学家艾德蒙·洛卡尔提出的问题。这个游戏的目标是将一个柱子上的全部盘子借助另外两个柱子,按照大小顺序移动到另一个柱子上,每次只能移动一个盘子,...

Global site tag (gtag.js) - Google Analytics