最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

VC++實(shí)現(xiàn)模擬漢諾塔效果

 更新時(shí)間:2015年03月06日 09:40:15   投稿:hebedich  
本文給大家分享的是一則使用vc++實(shí)現(xiàn)模擬漢諾塔效果的代碼,代碼實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,主要是漢諾塔算法的思路要正確,正在練習(xí)漢諾塔的小伙伴也可以來(lái)看看,希望大家能夠喜歡。

先上效果圖

再附上源代碼:

漢諾塔:

復(fù)制代碼 代碼如下:

#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();                // 繪出移動(dòng)一次后漢諾塔的狀態(tài)
}
// Print And Move
void printandmove(int n, char x, char y)
{
    printf("\n %d 號(hào)盤從 %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為漢諾塔盤子數(shù),如要改變,只需更改初始值即可。
    char one = 'A', two = 'B', three = 'C';
    printf("請(qǐng)輸入盤子個(gè)數(shù)[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òng)過程[%d個(gè)盤]\n\n", n);
        drawtower();            // 繪出漢諾塔初始狀態(tài)
        hanoi(n, one, two, three);
        printf("\n 模擬結(jié)束,共移動(dòng)%ld次\n", (long)pow(2, n) - 1);
    }
    else
    {
        printf("數(shù)據(jù)錯(cuò)誤!\n");
    }
}

漢諾塔.c

復(fù)制代碼 代碼如下:

/* 漢諾塔模擬
   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();                // 繪出移動(dòng)一次后漢諾塔的狀態(tài)
}
// Print And Move
void printandmove(int n, char x, char y)
{
    printf("\n %d 號(hào)盤從 %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為漢諾塔盤子數(shù),如要改變,只需更改初始值即可。
    char one = 'A', two = 'B', three = 'C';
    printf("請(qǐng)輸入盤子個(gè)數(shù)[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òng)過程[%d個(gè)盤]\n\n", n);
        drawtower();            // 繪出漢諾塔初始狀態(tài)
        hanoi(n, one, two, three);
        printf("\n 模擬結(jié)束,共移動(dòng)%ld次\n", (long)pow(2, n) - 1);
    }
    else
    {
        printf("數(shù)據(jù)錯(cuò)誤!\n");
    }
}

以上所述就是關(guān)于VC++實(shí)現(xiàn)漢諾塔效果的全部代碼了,希望對(duì)大家理解漢諾塔算法能夠有所幫助。

相關(guān)文章

  • QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解

    QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用QT+ffmpeg實(shí)現(xiàn)視頻解析功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))

    C語(yǔ)言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))

    魔方陣是指由1,2,3……n2填充的,每一行、每一列、對(duì)角線之和均相等的方陣,階數(shù)n = 3,4,5…。魔方陣也稱為幻方陣,看下面的實(shí)現(xiàn)方法吧
    2013-11-11
  • C++詳細(xì)分析lambda表達(dá)式的本質(zhì)

    C++詳細(xì)分析lambda表達(dá)式的本質(zhì)

    Lambda表達(dá)式是現(xiàn)代C++在C ++ 11和更高版本中的一個(gè)新的語(yǔ)法糖 ,在C++11、C++14、C++17和C++20中Lambda表達(dá)的內(nèi)容還在不斷更新。 lambda表達(dá)式(也稱為lambda函數(shù))是在調(diào)用或作為函數(shù)參數(shù)傳遞的位置處定義匿名函數(shù)對(duì)象的便捷方法
    2022-06-06
  • 利用C語(yǔ)言實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的飛機(jī)游戲

    利用C語(yǔ)言實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的飛機(jī)游戲

    在前面彈跳小球?的基礎(chǔ)上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的飛機(jī)游戲,主要包括飛機(jī)的顯示、控制移動(dòng)、顯示復(fù)雜圖案、發(fā)射激光、打靶練習(xí)等功能,感興趣的可以嘗試一下
    2022-10-10
  • C語(yǔ)言中組成不重復(fù)的三位數(shù)問題

    C語(yǔ)言中組成不重復(fù)的三位數(shù)問題

    這篇文章主要介紹了C語(yǔ)言中組成不重復(fù)的三位數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解

    C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解的相關(guān)資料,實(shí)現(xiàn)該功能可以通過定義全局的指向Blocks的對(duì)象指針來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2017-07-07
  • C++使用UDP通訊的實(shí)現(xiàn)示例

    C++使用UDP通訊的實(shí)現(xiàn)示例

    本文實(shí)現(xiàn)對(duì)C++使用UDP做了簡(jiǎn)單封裝,實(shí)現(xiàn)通訊,包括服務(wù)端和客戶端,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫(kù)文件的詳細(xì)過程

    VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫(kù)文件的詳細(xì)過程

    這篇文章主要介紹了VisualStudio?制作Dynamic?Link?Library動(dòng)態(tài)鏈接庫(kù)文件的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • C++ Boost Optional示例超詳細(xì)講解

    C++ Boost Optional示例超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C/C++中宏定義(#define)

    C/C++中宏定義(#define)

    #define命令是C語(yǔ)言中的一個(gè)宏定義命令,它用來(lái)將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,該標(biāo)識(shí)符被稱為宏名,被定義的字符串稱為替換文本。接下拉通過本文給大家分享C/C++中宏定義(#define)知識(shí),需要的朋友參考下
    2017-02-02

最新評(píng)論

柯坪县| 开封县| 吴忠市| 眉山市| 阳信县| 思南县| 安塞县| 葫芦岛市| 泾川县| 扬州市| 资源县| 隆昌县| 离岛区| 延安市| 名山县| 合水县| 凭祥市| 长宁县| 海口市| 太和县| 闵行区| 搜索| 壶关县| 云林县| 石泉县| 福泉市| 澄江县| 颍上县| 手机| 宾川县| 泰宁县| 九台市| 曲水县| 舒城县| 桓仁| 嵩明县| 绍兴县| 清河县| 镇平县| 香港| 龙江县|