.Algorithm Gossip (12) 双色、三色河内塔

前言

This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

提出问题

12.Algorithm Gossip: 双色、三色河内塔

基本说明

双色河内塔与三色河内塔是由之前所介绍过的河内塔规则衍生而来,就是每层是两种颜色交替。而三色河内塔则是每层是三种颜色交替。

解法

无论是双色河内塔或是三色河内塔,其解法观念与之前介绍过的河内塔是类似的,同样也是使用递回来解,不过这次递回解法的目的不同,同样对待递归问题, 解法非常单一, 注意到递归的出口,午后效性(就是递归深度的上下级联系); 我们先来看只有两个盘的情况,这很简单 ,只要将第一柱的黄色移动至第二柱,而接下来第一柱的蓝色移动至第三柱。再来是四个盘的情况,首先必须用递回完成。

双色河内塔 C 实作

#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);
        } else {
        hanoi(disks-1,source,target,temp);
        hanoi(1,source,temp, target);
        hanoi(disks-1,temp, source,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;
    }

三色河内塔 C#include

代码

三色塔 python 实现

#include <stdio.h>
def hanoi(disks, source,temp, target):
    if disks == 1:
        print('move disk from',source,'to', target) 
        print('move disk from',source,'to', target) 
        print('move disk from',source,'to', target) 
    else:
        hanoi(disks-1,source,target,temp) 
        hanoi(1,source,temp, target) 
        hanoi(disks-1,temp, source,target) 

def hanoi3colors(disks):
    source = 'A' 
    temp = 'B' 
    target = 'C' 
    if(disks == 3):
        print('move disk from',source,'to', temp) 
        print('move disk from',source,'to', temp) 
        print('move disk from',source,'to', target) 
        print('move disk from',temp,'to', target) 
        print('move disk from',temp,'to', source) 
        print('move disk from',target,'to', temp) 
    else:
        hanoi(disks/3-1,source,temp, target) 
        print('move disk from',source,'to', temp) 
        print('move disk from',source,'to', temp) 
        print('move disk from',source,'to', temp) 
        hanoi(disks/3-1,target,temp, source) 
        print('move disk from',temp,'to', target) 
        print('move disk from',temp,'to', target) 
        print('move disk from',temp,'to', target) 
        hanoi(disks/3-1,source,target,temp) 
        print('move disk from',target,'to', source) 
        print('move disk from',target,'to', source) 
        hanoi(disks/3-1,temp, source,target) 
        print('move disk from',source,'to', temp) 
        for i in [disks/3 -1 - i for i in range(int(disks/3-1))]:
            if (i>1):
                hanoi(i-1, target,source,temp) 
                print('move disk from',target,'to', source) 
                print('move disk from',target,'to', source) 
                if (i>1):
                    hanoi(i-1, temp, source,target) 
                print('move disk from',source,'to', temp)

hanoi3colors(6)

拓展和关联

后记

参考书籍

  • 《经典算法大全》
  • 维基百科
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值