刚开始学习《算法设计与分析》
里面的汉诺塔问题的求解算法简直让我无语了··
用3个语句就把这么复杂的问题解决了
相信很多人跟我一样,对其中实际的移动过程还是不太清楚·
我就自己写了这个模拟汉诺塔移动过程的程序~~
里面用数字代替圆盘~~数字越大代表的圆盘就越大
我没写可供外部输入的函数,大家可以直接修改程序里的全局数据里的数据就可以了
主要可以修改两个,num为圆盘数,建议大家不要改超过8,8个圆盘要2^8=255步解开~~10个时已经超过1000步了
为了让移动过程更加明显,在移动一步后会暂停一下程序,暂停时间为timeSleep,大家可以修改此参数来选择合适的暂停时间。
代码在VC2008下编译通过。如果在VC6.0下只要把开头的#include “stdafx.h”去掉,以及把主函数名改为main,把参数去掉就可以了
代码如下:
// 汉诺塔.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
// 全局数据
const int num = 4; // 汉诺塔的圆盘的个数
const int timeSleep = 500; // 暂停一下
int count = 0; // 步数计数器
COORD line[3]; // 记录3个铁柱的顶端位置
COORD Step; // 显示步数的位置
HANDLE hScreen; // 控制台显示句柄
//////////////////////////////////////////////////////////////////////////
// 函数
/* 递归求解汉诺塔问题(与显示无关) */
void hanoi(const int n, const int a, const int b, const int c);
/* 显示每一步 */
void move(const int n, const int a, const int c);
/* 绘制初始汉诺塔 */
void DrawHanoi();
/* 主函数 */
int _tmain(int argc, _TCHAR* argv[])
{
/* 得到控制台显示句柄 */
hScreen = GetStdHandle(STD_OUTPUT_HANDLE);
/* 初始化各铁柱的顶端位置 */
line[0].X = 0;
line[0].Y = 0;
line[1].X = 5;
line[1].Y = num;
line[2].X = 10;
line[2].Y = num;
/* 初始化显示步数的位置 */
Step.X = 15;
Step.Y = num - 1;
/* 绘制初始汉诺塔 */
DrawHanoi();
/* 递归求解汉诺塔 */
hanoi(num, 0, 1, 2);
return 0;
}
/* 将n个圆盘从a柱借助b柱移动c柱上 */
void hanoi(const int n, const int a, const int b, const int c)
{
if (n > 0) {
/* 将n-1个圆盘从a柱借助c柱移动b柱上 */
hanoi(n - 1, a, c, b);
/* 将第n个圆盘从a柱移动到c柱上 */
move(n, a, c);
/* 将n-1个圆盘从b柱借助a柱移动c柱上 */
hanoi(n - 1, b, a, c);
}
}
/* 将第n个圆盘从a柱移动到c柱上 */
void move(const int n, const int a, const int c)
{
/* 定位到a柱上 */
SetConsoleCursorPosition(hScreen, line[a]);
/* 清空原圆盘 */
cout << " ";
/* a柱顶端位置向下移一位 */
line[a].Y++;
/* 要添加圆盘首先要将c柱顶端位置向上移一位 */
line[c].Y--;
/* 定位到c柱上 */
SetConsoleCursorPosition(hScreen, line[c]);
/* 显示新圆盘 */
cout << n;
/* 显示步数 */
SetConsoleCursorPosition(hScreen, Step);
cout << ++count;
/* 暂停一下 */
Sleep(timeSleep);
}
/* 绘制初始汉诺塔 */
void DrawHanoi()
{
SetConsoleCursorPosition(hScreen, line[0]);
for (int i = 1; i <= num; i++) {
cout << i << endl;
}
SetConsoleCursorPosition(hScreen, Step);
cout << "步数:";
Step.X += 6;
}