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

C++ 漢諾塔問題知識點總結(jié)

 更新時間:2020年02月19日 14:26:44   作者:000紫外線000  
在本篇文章里小編給大家整理的是關(guān)于C++ 漢諾塔問題知識點內(nèi)容,有需要的朋友們可以參考下。

漢諾塔問題,是心理學實驗研究常用的任務(wù)之一。當然我們是學計算機的,因此我們嘗試用計算機去求解它。

例題

openjudge6261 漢諾塔問題

描述

有一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由n個圓盤構(gòu)成的塔。目的是將最左邊桿上的盤全部移到中間的桿上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。這就是著名的漢諾塔問題。

假定圓盤從小到大編號為1,2,3,……

輸入

輸入為一個整數(shù)后面跟三個單字符字符串。

整數(shù)為盤子的數(shù)目,后三個字符表示三個桿子的編號。

輸出

輸出每一步移動盤子的記錄。一次移動一行。

每次移動的記錄為例如 a->3->b 的形式,即把編號為3的盤子從a桿移至b桿。

樣例輸入

2 a b c

樣例輸出

a->1->c
a->2->b
c->1->b

漢諾塔問題

漢諾塔問題的解決算法是一種經(jīng)典的分治算法,而分治算法最重要的三個步驟:

  1. 分解:如果說我們要將num個盤子從原柱子l通過過渡柱子mid移動到目標柱子r,那么我們可以先把上面的(num - 1)個盤子從原柱子l移動到過渡柱子mid,之后再把編號num的這個盤子移動到目標柱子r上,最后再把那(num - 1)個盤子從過渡柱子mid移動到目標柱子r,就成功了。
  2. 解決:用遞歸分別再去解決子問題并輸出。(邊界條件:當只有一個盤子既num == 1時,直接輸出就好了)。
  3. 合并:遞歸回來的就是結(jié)果了,不用再合并。

簡而言之,就是每次我們把第num個盤子單獨看成一個整體,剩下(num - 1)個盤子看成一個整體,之后對這兩個整體分別去進行移動,使其到達目標位置。

最后算一下時間復雜度,這里稍微有些難算。

假設(shè)i個盤子從一根柱子移動到另一根柱子需要step(i)步

對于一個單獨的塔,程序會進行以下操作:

  1. 將上面的(n - 1)個盤子移動到過渡柱子,次數(shù)為step(n - 1)。
  2. 將第n個盤子移動到目標柱子,次數(shù)為1。
  3. 將過渡柱子上的(n - 1)個盤子移動到目標柱子,次數(shù)為step(n - 1)。

則可以得到遞推式

step(n) = 2 * step(n - 1) + 1

之后不停地遞推下去,就會得到

step(n) = 2^n * step(0) + 2^(n - 1) + 2^(n - 2) + ...... + 2^1 + 2^0

又因為0個盤子根本不用移,所以step(0) = 0

所以step(n) = 2^(n - 1) + 2^(n - 2) + ...... + 2^1 + 2^0

之后用等比數(shù)列的公式就可以推出:step(n) = 2^n^ - 1

我們發(fā)現(xiàn)移動次數(shù)為2^n^ - 1,實際上這也是漢諾塔問題最少的移動次數(shù)。所以最后得出解決漢諾塔問題的算法時間復雜度為O(2^n^)。

代碼

# include <cstdio>
# include <iostream> 
# include <cmath>
# include <cstring>
# include <algorithm>

using namespace std;

int n;
char a, b, c;

// hanoi(num, l, mid, r)表示需要將num個盤子從柱子l通過柱子mid移動到柱子r。
void hanoi(int num, char l, char mid, char r)
{
  if (num == 1) printf("%c->%d->%c\n", l, num, r);
  else {
    hanoi(num - 1, l, r, mid);
    printf("%c->%d->%c\n", l, num, r);
    hanoi(num - 1, mid, l, r);
  }
}

int main()
{
  scanf("%d", &n);
  cin >> a >> b >> c;
  hanoi(n, a, c, b); // 這里因為題目中是讓所有盤子從左面的柱子移動到中間的柱子,既從a到b。
  return 0;
}

就是小編整理的全部相關(guān)知識點,感謝大家的學習和對腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • Qt地圖自適應(yīng)拉伸的實現(xiàn)示例

    Qt地圖自適應(yīng)拉伸的實現(xiàn)示例

    最近需要寫一個程序,要是讓qt到程序自適應(yīng),本文主要介紹了Qt地圖自適應(yīng)拉伸的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++11之后的decltype類型指示符詳解

    C++11之后的decltype類型指示符詳解

    為了滿足這一要求,C++11?新標準引入了另一種類型說明符?decltype?,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類型,這篇文章主要介紹了C++11之后的decltype類型指示符,需要的朋友可以參考下
    2023-01-01
  • C++使用鏈表存儲實現(xiàn)通訊錄功能管理

    C++使用鏈表存儲實現(xiàn)通訊錄功能管理

    這篇文章主要為大家詳細介紹了C++使用鏈表存儲實現(xiàn)通訊錄功能管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言將音視頻時鐘同步封裝成通用模塊的方法

    C語言將音視頻時鐘同步封裝成通用模塊的方法

    視頻的時鐘基于視頻幀的時間戳,由于視頻是通過一定的幀率渲染的,采用直接讀取當前時間戳的方式獲取時鐘會造成一定的誤差,精度不足,這篇文章主要介紹了c語言將音視頻時鐘同步封裝成通用模塊,需要的朋友可以參考下
    2022-09-09
  • 基于easyx的C++實現(xiàn)貪吃蛇

    基于easyx的C++實現(xiàn)貪吃蛇

    這篇文章主要為大家詳細介紹了基于easyx的C++實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言strcat函數(shù)詳解:字符串追加的利器

    C語言strcat函數(shù)詳解:字符串追加的利器

    strcat函數(shù)用于將源字符串追加到目標字符串的末尾,并返回一個指向目標字符串的指針,它可以實現(xiàn)字符串的拼接操作
    2024-08-08
  • VC++中圖像處理類CBitmap的用法

    VC++中圖像處理類CBitmap的用法

    使用VC進行圖像處理的時候,CBitmap類為我們提供了豐富的位圖處理函數(shù),本文總結(jié)了該類的相關(guān)函數(shù)和常用使用方法,包括加載位圖,顯示位圖,析構(gòu)CBitmap資源以及在內(nèi)存中保存位圖等內(nèi)容。
    2015-11-11
  • C++和java設(shè)計模式之單例模式

    C++和java設(shè)計模式之單例模式

    這篇文章主要為大家詳細介紹了C++和java設(shè)計模式之單例模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • C語言全局變量和局部變量的示例代碼

    C語言全局變量和局部變量的示例代碼

    本文主要介紹了C語言全局變量和局部變量的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • C++回溯算法廣度優(yōu)先搜索舉例分析

    C++回溯算法廣度優(yōu)先搜索舉例分析

    回溯在迷宮搜索中使用很常見,就是這條路走不通,然后返回前一個路口,繼續(xù)下一條路?;厮菟惴ㄕf白了就是窮舉法,下面讓我們一起來看看吧
    2022-03-03

最新評論

当雄县| 凤山县| 新建县| 佛冈县| 鲁山县| 太谷县| 东台市| 富平县| 碌曲县| 五常市| 友谊县| 龙口市| 楚雄市| 海兴县| 潞城市| 读书| 东丰县| 淄博市| 太仓市| 芮城县| 康保县| 邯郸市| 定边县| 江华| 屯门区| 新竹县| 乌苏市| 波密县| 湘潭县| 丰顺县| 乌审旗| 且末县| 钟山县| 宜兴市| 汉中市| 淳安县| 合阳县| 通化市| 云阳县| 拜泉县| 衡阳县|