C語(yǔ)言漢諾塔的簡(jiǎn)單了解
漢諾塔詳解
以4層為例
以下為我的拙見,還希望大佬雅正

要把漢諾塔移動(dòng)到c 需要把1,2,3層移到b 把4移動(dòng)到c 在吧123移動(dòng)到b

但是一次只能動(dòng)一塊 所以我們目前要做的就是把上面三塊移動(dòng)到b
那就需要把1 2移動(dòng)到c

由此我們可以推出要把1,2移動(dòng)到c,只需要把1移動(dòng)到b
這里我們發(fā)現(xiàn)有很多重復(fù)的自相似動(dòng)作
我們就可以設(shè)計(jì)遞歸 遞歸需要1,遞歸體 2 出口。
遞歸體
移動(dòng)n-1個(gè)盤子和1個(gè)盤子和n個(gè)盤子過(guò)程都是相似的
但是每次放入的桿子不一樣。
出口
n=1時(shí)只剩一個(gè)盤子,直接移動(dòng)到c即可
hanoi(n ,A , B , C)
N 移動(dòng)數(shù)量
A 出發(fā)地
B 借助地
C 終點(diǎn)
這個(gè)函數(shù)的意思就是有n個(gè)盤子從A出發(fā)借助B來(lái)到C
現(xiàn)在有n層漢諾塔 就需要把上面n-1層移動(dòng)到B

hanoi(n-1,A,C,B)
這個(gè)函數(shù)就是我們要把n-1個(gè)盤子從A借助C移動(dòng)到B

move(a,c)現(xiàn)在不需要再借助了 可以直接從a移動(dòng)到c
接下來(lái)我們就要借助A吧剩下n-1個(gè)盤子移動(dòng)到C了
hanoi(n-1,B,A,C)即可完成
遞歸出口
n<=1
在這里插入代碼片
```// 漢諾塔問(wèn)題
//輸出移動(dòng)的步驟
#include <stdio.h>
//記錄步數(shù)
int i = 1;
//n 第幾號(hào)盤移動(dòng), from 移動(dòng)塔 to 目標(biāo)塔
void move(int n, char from, char to) {
printf("第%d次移動(dòng)第%d號(hào)盤: %c----->%c\n", i++, n, from, to);
}
void hanoi(int n, char from, char mid, char to) {
if (n == 1) {
move(n, from, to);//只有一個(gè)盤子是直接將初塔上的盤子移動(dòng)到目的地
}//函數(shù)出口
else {
hanoi(n - 1, from, to, mid);//先將初始塔的前n-1個(gè)盤子借助目的塔移動(dòng)到借用塔上
move(n, from, to); //將剩下的一個(gè)盤子移動(dòng)到目的塔上
hanoi(n - 1, mid, from, to);//最后將借用塔上的n-1個(gè)盤子移動(dòng)到目的塔上
}
}
int main() {
printf("請(qǐng)輸入盤子的個(gè)數(shù):\n");
int n;
scanf_s("%d", &n);
char x = 'A', y = 'B', z = 'C';
printf("盤子移動(dòng)情況如下:\n");
hanoi(n, x, y, z);
return 0;
}
總結(jié)
到此這篇關(guān)于C語(yǔ)言漢諾塔的文章就介紹到這了,更多相關(guān)C語(yǔ)言漢諾塔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++string底層框架模擬實(shí)現(xiàn)代碼
本節(jié)文章主要說(shuō)明淺拷貝和深拷貝的優(yōu)缺點(diǎn),以及仿寫string類的邏輯并分析實(shí)現(xiàn)過(guò)程,對(duì)C++string底層框架模擬實(shí)現(xiàn)代碼感興趣的朋友一起看看吧2021-11-11
使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子的點(diǎn)數(shù)問(wèn)題
這篇文章主要介紹了使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子的點(diǎn)數(shù)問(wèn)題的方法,解答實(shí)例主要為了突出解題的算法,需要的朋友可以參考下2016-03-03
簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義
這篇文章主要介紹了簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
深入解析C++編程中__alignof 與__uuidof運(yùn)算符的使用
這篇文章主要介紹了C++編程中__alignof 與__uuidof運(yùn)算符的使用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
C++實(shí)現(xiàn)的O(n)復(fù)雜度內(nèi)查找第K大數(shù)算法示例
這篇文章主要介紹了C++實(shí)現(xiàn)的O(n)復(fù)雜度內(nèi)查找第K大數(shù)算法,結(jié)合實(shí)例形式分析了算法的原理以及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2017-08-08
可能是全網(wǎng)最詳細(xì)的Qt連接MySQL數(shù)據(jù)庫(kù)教程
QT眾所周知是一個(gè)開源的,以C++為底層的可視化工具庫(kù),下面這篇文章主要給大家介紹了關(guān)于最詳細(xì)的Qt連接MySQL數(shù)據(jù)庫(kù)教程的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04

