前面的文章介绍了栈和递归,以及举例了汉诺塔的实现原理,下面是实现汉诺塔的源码。
假设有3个分别命名为X、Y、Z的塔座,在塔座X上插有n个直径大小不同、依小到大编号为1,2,……,n的圆盘,如下图。
现要求将X轴上的n个圆盘移到Z上并仍按同样的顺序叠排,圆座移动必须遵循下列规则:
(1)每次只能移动一个圆盘。
(2)圆盘可以插在X,Y,Z中的任一塔座上。
(3)任何时刻都不能将一个教大的圆盘压在较小的圆盘之上。
具体分析,查看第20篇博客:http://blog.csdn.net/yuyuntan/article/details/51099135
int Count=0;
void move(char x, int n, char z);
void hanoi (int n, char x, char y, char z) { // 算法3.5
// 将塔座x上按直径由小到大且至上而下编号为1至n的n个圆盘按规则搬到
// 塔座z上,y可用作辅助塔座。
// 搬动操作 move (x, n, z) 可定义为:
// (c是初值为0的全局变量,对搬动计数)
// printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z);
if (n==1)
move(x, 1, z); //将编号为1的圆盘从x移到z
else {
hanoi(n-1,x,z,y);
move(x, n, z); //将编号为n的圆盘从x移到z
hanoi(n-1, y, x, z); //将y上编号为1至n-1的圆盘移到z,x作辅助塔
}
}
void move(char x, int n, char z) {
printf(" %2i. Move disk %i from %c to %c\n",++Count,n,x,z);
}
#include <iostream>
using namespace std;
int Count = 0;
void move(char x, int n, char z);
void hanoi(int n, char x, char y, char z) { // 算法3.5
// 将塔座x上按直径由小到大且至上而下编号为1至n的n个圆盘按规则搬到
// 塔座z上,y可用作辅助塔座。
// 搬动操作 move (x, n, z) 可定义为:
// (c是初值为0的全局变量,对搬动计数)
if (n == 1)
move(x, 1, z); //将编号为1的圆盘从x移到z
else {
hanoi(n - 1, x, z, y);
move(x, n, z); //将编号为n的圆盘从x移到z
hanoi(n - 1, y, x, z); //将y上编号为1至n-1的圆盘移到z,x作辅助塔
}
}
void move(char x, int n, char z) {
cout << ++Count << ". Move disk " << n << " from " << x << " to " << z << "."<<endl;
}
int main()
{
cout << "***************************************************************************" << endl;
cout << " 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 " << endl;
cout << " 编写年月2016年4月 " << endl;
cout << " 编写者:YuYunTan " << endl;
cout << " hanoi问题 " << endl;
cout << "***************************************************************************" << endl;
int n = 0;//圆盘的个数
char x='X', y='Y', z='Z';//柱子的名称
cout << "please input disk number :";
cin >> n;
hanoi(n, x, y, z);
system("pause");
return 0;
}
package hanoi;
import java.util.Scanner;
public class HanoiSolution {
public static int count=0;
public static void hanoi(int n,char x,char y,char z){
if(n == 1)
move(x,1,z);//将编号为1的圆盘从x移动到z
else{
hanoi(n-1,x,z,y);//将x上编号为1至n-1的圆盘移到y,z作辅助塔
move(x,n,z);//将编号为n的圆盘从x移到z
hanoi(n-1,y,x,z); //将y上编号为1至n-1的圆盘移到z,x作辅助塔
}
}
private static void move(char x, int n, char z) {
// TODO Auto-generated method stub
System.out.println((++count)+". Move disk "+n+" from "+x+" to "+z+".");
}
public static void main(String[] args) {
System.out.println("**************************************************");
System.out.println("** 《数据结构》<C语言版本>严蔚敏 吴伟名 编著 **");
System.out.println("** 编写年月2016年4月 **");
System.out.println("** 编写者:YuYunTan **");
System.out.println("** Hanoi问题 **");
System.out.println("**************************************************");
System.out.print("please input disk number:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
char x='X',y='Y',z='Z';
hanoi(n,x,y,z);
System.out.println("Hanoi is over");
}
}