算法设计 -- VC控制台模拟“汉诺塔”移动过程

刚开始学习《算法设计与分析》

里面的汉诺塔问题的求解算法简直让我无语了··

用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;
}

 

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/gouki04/article/details/4564687
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞