91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中漢諾塔問題怎么解決

發布時間:2022-04-15 10:57:07 來源:億速云 閱讀:159 作者:iii 欄目:編程語言

這篇文章主要介紹“C++中漢諾塔問題怎么解決”,在日常操作中,相信很多人在C++中漢諾塔問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++中漢諾塔問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

openjudge6261 漢諾塔問題

描述

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

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

輸入

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

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

輸出

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

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

樣例輸入

2 a b c

樣例輸出

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

漢諾塔問題

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

  1. 分解:如果說我們要將num個盤子從原柱子l通過過渡柱子mid移動到目標柱子r,那么我們可以先把上面的(num - 1)個盤子從原柱子l移動到過渡柱子mid,之后再把編號num的這個盤子移動到目標柱子r上,最后再把那(num - 1)個盤子從過渡柱子mid移動到目標柱子r,就成功了。

  2. 解決:用遞歸分別再去解決子問題并輸出。(邊界條件:當只有一個盤子既num == 1時,直接輸出就好了)。

  3. 合并:遞歸回來的就是結果了,不用再合并。

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

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

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

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

  1. 將上面的(n - 1)個盤子移動到過渡柱子,次數為step(n - 1)。

  2. 將第n個盤子移動到目標柱子,次數為1。

  3. 將過渡柱子上的(n - 1)個盤子移動到目標柱子,次數為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

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

我們發現移動次數為2^n^ - 1,實際上這也是漢諾塔問題最少的移動次數。所以最后得出解決漢諾塔問題的算法時間復雜度為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;
}

到此,關于“C++中漢諾塔問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

木兰县| 年辖:市辖区| 宾川县| 柳河县| 时尚| 双桥区| 枣强县| 吴堡县| 灵武市| 甘洛县| 永康市| 平南县| 通榆县| 阳新县| 临泽县| 高雄市| 曲阜市| 达孜县| 大埔区| 二连浩特市| 遂溪县| 巴中市| 新源县| 乐东| 桃园县| 阿坝县| 扶沟县| 寻乌县| 蒙山县| 鲁山县| 灵石县| 赞皇县| 旺苍县| 德格县| 教育| 廉江市| 泰来县| 松滋市| 凤翔县| 杭锦后旗| 九江县|