汉诺塔问题

汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。

我们约定:顶部到底部的棒子编号依次为1,2,...n

核心算法:

1.先把A的n-1个棒子从X借助Z移到Y

2.把 A的最后一个棒子从X移动到Z

3.把Y的n-1棒子借助X移动到Z

代码:

/*
============================================================================
Name        : Hannuota.c
Author      :
Version     :
Copyright   : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

#include <stdio.h>  
int count = 0;
//此函数表示X坐标有n个棒子需要借助Y坐标转移到Z坐标  
void hannuo(char x, char y, char z, int n) {
    if (n == 1) {
        printf("第%d次:棒子%d从%c移动到%c\n ", ++count,n, (char)x,(char) z);
        return;
    }

    hannuo(x, z, y, n - 1);   //1.先把A的n-1个棒子从X借助Z移到Y  
    printf("第%d次:棒子%d从%c移动到%c\n ", ++count, n, (char)x, (char)z);
    hannuo(y, x, z, n - 1);             //3.把Y的n-1棒子借助X移动到Z  

}
void main(void) {
    char x='X', y='Y', z='Z';
    int n =3;
    hannuo(x, y, z, n);
}
记住:总次数为2^n-1
测试结果:

汉诺塔问题_第1张图片

你可能感兴趣的:(汉诺塔问题)