当前位置: 首页 > 编程笔记 >

VC++实现模拟汉诺塔效果

洪知
2023-03-14
本文向大家介绍VC++实现模拟汉诺塔效果,包括了VC++实现模拟汉诺塔效果的使用技巧和注意事项,需要的朋友参考一下

先上效果图

再附上源代码:

汉诺塔:


#include "stdio.h"

#include "math.h"

int arrA[15], arrB[15], arrC[15];   // 分别为A、B、C

int length;

int lenA, lenB, lenC;

char plate[32];

// Make

void makeplate(int n)

{

    int i;

    if (n == length + 1)

    {

        for (i = 0; i < 2 * length + 3; i++)

        {

            if (i == length + 1)

            {

                plate[i] = '|';

            }

            else

            {

                plate[i] = '_';

            }

        }

    }

    else

    {

        if (n == 0)

        {

            for (i = 0; i < 2 * length + 3; i++)

            {

                if (i == length + 1)

                {

                    plate[i] = '|';

                }

                else

                {

                    plate[i] = ' ';

                }

            }

        }

        else

        {

            for (i = 0; i < 2 * length + 3; i++)

            {

                if (i == length + 1)

                {

                    plate[i] = '|';

                }

                else

                {

                    if (i >= length + 1 - n && i <= length || i > length + 1

                        && i <= length + 1 + n)

                    {

                        plate[i] = '_';

                    }

                    else

                    {

                        plate[i] = ' ';

                    }

                }

            }

        }

    }

    plate[i] = '\0';

}

// Draw

void drawtower()

{

    int i;

    printf(" ");

    for (i = length; i >= 0; i--)

    {

        if (i <= lenA)

        {

            makeplate(arrA[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        if (i <= lenB)

        {

            makeplate(arrB[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        if (i <= lenC)

        {

            makeplate(arrC[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        printf("\n ");

    }

}

// Move

void moveplate(int n, char x, char y)

{

    int i, j;

    if (x == 'A')

    {

        lenA--;

    }

    else

    {

        if (x == 'B')

        {

            lenB--;

        }

        else

        {

            lenC--;

        }

    }

    if (y == 'A')

    {

        lenA++;

        arrA[lenA] = n;

    }

    else

    {

        if (y == 'B')

        {

            lenB++;

            arrB[lenB] = n;

        }

        else

        {

            lenC++;

            arrC[lenC] = n;

        }

    }

    drawtower();                // 绘出移动一次后汉诺塔的状态

}

// Print And Move

void printandmove(int n, char x, char y)

{

    printf("\n %d 号盘从 %c 柱移到 %c 柱\n\n", n, x, y);

    moveplate(n, x, y);

}

// Hanoi

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

{

    if (n == 1)

    {

        printandmove(n, one, three);

    }

    else

    {

        hanoi(n - 1, one, three, two);

        printandmove(n, one, three);

        hanoi(n - 1, two, one, three);

    }

}

// Main

void main()

{

    int n, i;                   // n为汉诺塔盘子数,如要改变,只需更改初始值即可。

    char one = 'A', two = 'B', three = 'C';

    printf("请输入盘子个数[1—12]:");

    scanf("%d", &n);

    if (n >= 1 && n <= 12)

    {

        length = n;

        lenA = n;

        for (i = 0; i <= lenA; i++)

        {

            arrA[i] = n + 1 - i;

        }

        lenB = lenC = 0;

        arrB[0] = arrC[0] = n + 1;

        printf(" 汉诺塔模拟移动过程[%d个盘]\n\n", n);

        drawtower();            // 绘出汉诺塔初始状态

        hanoi(n, one, two, three);

        printf("\n 模拟结束,共移动%ld次\n", (long)pow(2, n) - 1);

    }

    else

    {

        printf("数据错误!\n");

    }

}

汉诺塔.c


/* 汉诺塔模拟

   2013-5-13 

*/

#include "stdio.h"

#include "math.h"

int arrA[15], arrB[15], arrC[15];   // 分别为A、B、C

int length;

int lenA, lenB, lenC;

char plate[32];

// Make

void makeplate(int n)

{

    int i;

    if (n == length + 1)

    {

        for (i = 0; i < 2 * length + 3; i++)

        {

            if (i == length + 1)

            {

                plate[i] = '|';

            }

            else

            {

                plate[i] = '_';

            }

        }

    }

    else

    {

        if (n == 0)

        {

            for (i = 0; i < 2 * length + 3; i++)

            {

                if (i == length + 1)

                {

                    plate[i] = '|';

                }

                else

                {

                    plate[i] = ' ';

                }

            }

        }

        else

        {

            for (i = 0; i < 2 * length + 3; i++)

            {

                if (i == length + 1)

                {

                    plate[i] = '|';

                }

                else

                {

                    if (i >= length + 1 - n && i <= length || i > length + 1

                        && i <= length + 1 + n)

                    {

                        plate[i] = '_';

                    }

                    else

                    {

                        plate[i] = ' ';

                    }

                }

            }

        }

    }

    plate[i] = '\0';

}

// Draw

void drawtower()

{

    int i;

    printf(" ");

    for (i = length; i >= 0; i--)

    {

        if (i <= lenA)

        {

            makeplate(arrA[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        if (i <= lenB)

        {

            makeplate(arrB[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        if (i <= lenC)

        {

            makeplate(arrC[i]);

            printf("%s", plate);

        }

        else

        {

            makeplate(0);

            printf("%s", plate);

        }

        printf("\n ");

    }

}

// Move

void moveplate(int n, char x, char y)

{

    int i, j;

    if (x == 'A')

    {

        lenA--;

    }

    else

    {

        if (x == 'B')

        {

            lenB--;

        }

        else

        {

            lenC--;

        }

    }

    if (y == 'A')

    {

        lenA++;

        arrA[lenA] = n;

    }

    else

    {

        if (y == 'B')

        {

            lenB++;

            arrB[lenB] = n;

        }

        else

        {

            lenC++;

            arrC[lenC] = n;

        }

    }

    drawtower();                // 绘出移动一次后汉诺塔的状态

}

// Print And Move

void printandmove(int n, char x, char y)

{

    printf("\n %d 号盘从 %c 柱移到 %c 柱\n\n", n, x, y);

    moveplate(n, x, y);

}

// Hanoi

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

{

    if (n == 1)

    {

        printandmove(n, one, three);

    }

    else

    {

        hanoi(n - 1, one, three, two);

        printandmove(n, one, three);

        hanoi(n - 1, two, one, three);

    }

}

// Main

void main()

{

    int n, i;                   // n为汉诺塔盘子数,如要改变,只需更改初始值即可。

    char one = 'A', two = 'B', three = 'C';

    printf("请输入盘子个数[1—12]:");

    scanf("%d", &n);

    if (n >= 1 && n <= 12)

    {

        length = n;

        lenA = n;

        for (i = 0; i <= lenA; i++)

        {

            arrA[i] = n + 1 - i;

        }

        lenB = lenC = 0;

        arrB[0] = arrC[0] = n + 1;

        printf(" 汉诺塔模拟移动过程[%d个盘]\n\n", n);

        drawtower();            // 绘出汉诺塔初始状态

        hanoi(n, one, two, three);

        printf("\n 模拟结束,共移动%ld次\n", (long)pow(2, n) - 1);

    }

    else

    {

        printf("数据错误!\n");

    }

}

以上所述就是关于VC++实现汉诺塔效果的全部代码了,希望对大家理解汉诺塔算法能够有所帮助。

 类似资料:
  • 本文向大家介绍C语言实现汉诺塔游戏,包括了C语言实现汉诺塔游戏的使用技巧和注意事项,需要的朋友参考一下 操作就是:A B 号码A的塔顶一层放在号码B的塔顶。如1(空格) 3 回车。 话说有人能把我这C的代码添加到QT界面框架上去么?  代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以

  • 本文向大家介绍C++ 实现汉诺塔的实例详解,包括了C++ 实现汉诺塔的实例详解的使用技巧和注意事项,需要的朋友参考一下 C++ 实现汉诺塔的实例详解 前言: 有A,B,C三塔,N个盘(从小到大编号为1-N)起初都在A塔,现要将N个盘全部移动到C塔(按照河内塔规则),求最少移动次数以及每次的移动详细情况。 要求: 需要采用递归方法和消除尾递归两种方法编写。 盘数N由用户从标准输入读入,以一个整数表示

  • 主要内容:分治算法解决汉诺塔问题,汉诺塔问题的代码实现汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则: 每次只能移动柱子最顶端的一个圆盘; 每个柱子上,小圆盘永远要位于大圆盘之上; 图 1 给您展示了包含 3 个圆盘的汉诺塔问题:   图 1 汉诺塔问题 一根柱子上摞

  • 汉诺塔是由法国数学家爱德华·卢卡斯在 1883 年发明的。他的灵感来自一个传说,有一个印度教寺庙,将谜题交给年轻的牧师。在开始的时候,牧师们被给予三根杆和一堆 64 个金碟,每个盘比它下面一个小一点。他们的任务是将所有 64 个盘子从三个杆中一个转移到另一个。有两个重要的约束,它们一次只能移动一个盘子,并且它们不能在较小的盘子顶部上放置更大的盘子。牧师日夜不停每秒钟移动一块盘子。当他们完成工作时,

  • 本文向大家介绍android实现模拟加载中的效果,包括了android实现模拟加载中的效果的使用技巧和注意事项,需要的朋友参考一下 最近闲着没事做了一个Android小程序,具体如下: 效果图: 原始界面 点击按钮运行    运行后界面 实现代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Java使用递归法解决汉诺塔问题的代码示例,包括了Java使用递归法解决汉诺塔问题的代码示例的使用技巧和注意事项,需要的朋友参考一下 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。 有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在