您的位置:首页 > 编程语言 > C语言/C++

经典递归应用--汉诺塔(C语言版)

2012-09-04 23:23 281 查看

经典递归应用--汉诺塔(C语言版)

//hanoi.c

//汉诺塔源码

//原理:

//移动n个盘子要经历(2的n次方-1)步。具体实现步骤是:1、将A上(n-1)个盘借助于C先移动到B座上;2、将A剩下的一个盘移动到C上;3、将(n-1)个盘从B借助于A移动到C上。

#include <stdio.h>

int count = 0;

//////////////////////////////////////////////////////////

//函数名:move

//功能:打印出x-->y,也就是具体的移动方法,并且计算总的移动步数

//入口参数:x-代表第一个座

// y-代表第二个座

//////////////////////////////////////////////////////////

void move(char x,char y)

{

printf("\t%c-->%c",x,y);

count++;

}

//////////////////////////////////////////////////////////

//函数名:hanoi

//功能:将n个盘从one座借助于two座,移动到three座

//入口参数:n-代表总的盘数

// one-代表第一个座

// two-代表第二个座

// three-代表第三个座

//////////////////////////////////////////////////////////

void hanoi(int n,char one,char two,char three)

{

if(n == 1) //如果只有一个盘,直接从one到three

move(one,three);

else //如果有多个1个盘

{

hanoi(n - 1,one,three,two);) //第一步:将n-1个盘从one借助three移到two

move(one,three); //第二步:将第n个盘从one移到three

hanoi(n - 1,two,one,three);//第三步:将n-1个盘从two借助one移到three

}

}

//////////////////////////////////////////////////////////

//函数名:main

//功能:总的控制,打印出移动方案和移动次数

//入口参数:无

//////////////////////////////////////////////////////////

int main()

{

int m;

printf("Input the number of disks:");

scanf("%d",&m); //输入盘的总数

printf("The step to moving %3d disks:\n\n",m);

hanoi(n,'a','b','c'); //打印出移动方案

printf("\nThe total times of moving are %d.\n",count); //打印出移动次数

return(0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: