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++实现汉诺塔效果的全部代码了,希望对大家理解汉诺塔算法能够有所帮助。