【二色汉诺塔 】

/*
二色汉诺塔
*/

#include <stdio.h>

void hanoi(int disks, char sources, char temp, char target)
{
    if(disks == 1)
    {
        printf("move disk from %c to %c \n", sources, target);
        printf("move disk from %c to %c \n", sources, target);
    }
    else
    {
        hanoi(disks - 1, sources, target, temp);
        hanoi(1, sources, temp, target);
        hanoi(disks - 1, temp, sources, target);
    }
}

void hanoi2colors(int disks)
{
    char source = ‘A‘;
    char temp = ‘B‘;
    char target = ‘C‘;
    int i;
    for(i = disks / 2; i > 1; i--)
    {
        hanoi(i - 1, source, temp, target);
        printf("move disk from %c to %c \n", source, temp);
        printf("move disk from %c to %c \n", source, temp);
        hanoi(i - 1, target, temp, source);
        printf("move disk from %c to %c \n", temp, target);
    }
    printf("move disk from %c to %c \n", source, temp);
    printf("move disk from %c to %c \n", source, target);
}

int main()
{
    int n;
    printf("请输入盘数:");
    scanf("%d", &n);
    hanoi2colors(n);

    return 0;
}
时间: 2024-08-26 16:38:19

【二色汉诺塔 】的相关文章

【三色汉诺塔】

/* 三色汉诺塔 */ #include <stdio.h> void hanoi(int disks, char source, char temp, char target) { if(disks == 1) { printf("move disk from %c to %c \n", source ,target); printf("move disk from %c to %c \n", source ,target); printf("

双色汉诺塔问题

问题描述: 已知 n ( n 是偶数)个盘子,大小相同的盘子有两个,叠放在一起,但下面的盘子是红色,上面的盘子是蓝色. 条件: 每次只能移动一个盘子 大盘子不能放在小盘子上面 在移动的过程中不能出现两个大小相同的盘子叠在一起,且下面的盘子是蓝色而上面的盘子是红色的情况. . . . 表示红盘 - - - 表示蓝盘 = = = 表示底座 分析: 注意条件3中 大小相同,上红下蓝 是 先与后非 的关系,两个同时满足才成立. 故这个双色Hanoi塔问题 等价于 从上到下,从小到大依次排列的Hanoi塔

Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s==0) return; 5 hanoi(s-1,a,c,b); //把最底下的从a借助c移动到b 6 printf("s from %c move to %c\n",a,c); 7 hanoi(s-1,b,a,c); //把刚才弄到b的借助a叠到c上 8 } 9 int main() 10

汉诺塔及其变形

汉诺塔 一.经典汉诺塔 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为F(n) 设F[n]表示将n个盘从按规则从X柱移到Z柱至少需要移动的次数. 当n=1时,F[n]=1: 当n>1时,将移动盘之的过程分为三步: 1)将A柱上的n-1个盘依靠Z柱移到Y柱上,这个需要F[n-1]步: 2)将A柱上剩下的一个盘(最大的盘)移到C柱上,

nyoj汉诺塔(二)

汉诺塔(二)题目链接 汉诺塔问题的经典结论:把i个盘子从一个柱子整体移到另一个柱子最少需要步数是 2的i次方减一.那我们这个给定一个初始局面,求他到目标局面(全部移到第三个柱子上)需要的最少步数.怎么办呢!! 分析: 1.总的来说一定是先把最大的盘子移到第三个柱子上, 然后再把第二大的移到柱子3上, 然后再把第三大的盘子移到柱子3上---直到把最小的盘子(1号盘子)移到柱子3上,才算结束. 2.现在设想一下,在移动第k个盘子动作前,柱子上的整体情况, 假设盘子k在柱子1上, 要移到柱子3上, 由

汉诺塔(二)(思维)

汉诺塔(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 汉诺塔的规则这里就不再多说了,详见题目:汉诺塔(一) 现在假设规定要把所有的金片移动到第三个针上,给你任意一种处于合法状态的汉诺塔,你能计算出从当前状态移动到目标状态所需要的最少步数吗? 输入 第一行输入一个整数N,表示测试数据的组数(0<N<20)每组测试数据的第一行是一个整数m表示汉诺塔的层数(0<m<32),随后的一行有m个整数Ai,表示第i小的金片所在的针的编号.(三根针的编号分别为

nyoj89 汉诺塔(二)

题目网址 :http://acm.nyist.net/JudgeOnline/problem.php?pid=89 汉诺塔问题的经典结论: 把i个盘子从一个柱子整体移到另一个柱子最少需要步数是 2的i次方减一.那我们这个给定一个初始局面,求他到目标局面(全部移到第三个柱子上)需要的最少步数.怎么办呢!! 分析: 1.总的来说一定是先把最大的盘子移到第三个柱子上, 然后再把第二大的移到柱子3上, 然后再把第三大的盘子移到柱子3上.........直到把最小的盘子(1号盘子)移到柱子3上,才算结束.

堆栈应用(二):汉诺塔

1.问题描述 汉诺塔( Towers of Hanoi)问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔1 ),其上有6 4个金碟(如图 5 - 4所示).所有碟子按从大到小的次序从塔底堆放至塔顶.紧挨着这座塔有另外两个钻石宝塔(塔 2和塔3).从世界创始之日起,婆罗门的牧师们就一直在试图把塔 1 上的碟子移动到塔 2上去,其间借助于塔 3的帮助.由于碟子非常重,因此,每次只能移动一个碟子.另外,任何时候都不能把一个碟子放在比它小的碟子上面.按照这个传说,当牧师们完成他们的任务之后

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,