ROOT
ROOT

c 语言解决汉诺塔问题

游戏规则: 有三根相邻的柱子,标号为 A,B,C,A 柱子上从下到上按金字塔状叠放着 n 个不同大小的圆盘,编号从上往下 1 到 n,现在把所有盘子一个一个移动到柱子 C 上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。 代码:

/*************************************************************************
    > File Name: hanoi.c
    > Author: Netcan
    > Mail: 1469709759@qq.com
    > Created Time: 2015/1/23 16:32:17
 ************************************************************************/

/* 盘子从上往下编号,1 到 n
 * 当 n == 1 的时候,
 *      直接将盘中从“A”柱移到“C”柱
 * 当 n >= 2 的时候,
 *      先将前 n-1 个盘子从“A”柱借助“C”柱移到“B”柱
 *      然后,将第 n 个盘子从“A”柱移到“C”柱
 *      最后,将“B”柱上 n-1 个盘子从“B”柱借助“A”柱移到“C”柱
 */

void hanoi(int n, char A, char B, char C); // 表示 n 个盘子从“A”柱借助“B”柱移到“C”柱 


#include<stdio.h>
int main()
{
    int n;
    printf("输入盘子数量:");
    scanf("%d",&n);
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

void hanoi(int n, char A, char B, char C)
{
    static int steps = 0;
    if ( 1 == n )
        printf("第 %d 步: 将编号为 %d 的盘子从 %c 柱移到 %c 柱 \n", ++steps, n, A, C);
    else {
        hanoi(n-1, A, C, B);
        printf("第 %d 步: 将编号为 %d 的盘子从 %c 柱移到 %c 柱 \n", ++steps, n, A, C);
        hanoi(n-1, B, A, C);
    }
    return;
}
支持一下
扫一扫,支持Netcan
  • 微信扫一扫
  • 支付宝扫一扫