Hanoi塔问题

(n阶Hanoi塔问题)假设有三个分别命名为A、B、C的塔座,在塔座A上插有n(n<20)个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在A、B、C中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 请通过编程来打印出移动的步骤.

输入

只有一组输入数据.输入数据N(;表示在开始时A塔座上的盘子数),当输入0时程序结束.

输出

输出移动的步骤.如"A-->C","A-->B"等.每两的步骤之间有三个空格隔开,每输出5个步骤就换行.详细的见Sample Output.

样例输入

5
2
0

样例输出

A-->C A-->B C-->B A-->C B-->A 
B-->C A-->C A-->B C-->B C-->A 
B-->A C-->B A-->C A-->B C-->B 
A-->C B-->A B-->C A-->C B-->A 
C-->B C-->A B-->A B-->C A-->C 
A-->B C-->B A-->C B-->A B-->C 
A-->C 
A-->B A-->C B-->C 

#include<stdio.h>
#include<math.h>
int i=0,m;
void move(char x,char y)
{
    printf("%c-->%c   ",x,y);
    i++;
    if(i%5==0)
        printf("
");
}
void hanoi(int n,char one,char two ,char three)
{
    if(n==1)move(one,three);
    else
    {
        hanoi(n-1,one,three,two);
        move(one,three);
        hanoi(n-1,two,one,three);
    }
}
main()
{
      do
    {   i = 0;
        scanf("%d",&m);
        if(m==0)
        break;
        hanoi( m,'A','B','C');
        printf("
");
    }while(m!=0);
}
原文地址:https://www.cnblogs.com/Lazy-Cat/p/9838293.html