《數(shù)據(jù)結(jié)構(gòu)(C語言版)》棧與遞歸之Hanoi塔
清華大學(xué)計算機(jī)系列教材? ?累計發(fā)行超400萬冊
嚴(yán)蔚敏 吳偉民?編著
數(shù)據(jù)結(jié)構(gòu)(C語言版)?
以下是本人對紫皮書第三章3.3節(jié)棧與遞歸的實現(xiàn)中Hanoi塔問題的代碼,3.2.5表達(dá)式求值、3.2.4迷宮求解、3.2.1數(shù)制轉(zhuǎn)換、3.2.2括號匹配的檢驗、3.2.3行編輯程序這些完整的代碼已在棧的應(yīng)用專欄給出
上運行結(jié)果:

代碼如下
(貌似專欄把我縮進(jìn)吃了,懶得加了,另外建議用visual studio編譯)?
#include <stdio.h>
void move(char a, int n, char b);//把第n個圓盤從塔柱a移動到塔柱b
void hanoi(int n, char x, char y, char z);//中間的y為輔助塔,將塔座x上的n個圓盤搬到塔座z上
int count = 0;//計算搬運次數(shù)
int main()
{
char x = 'x';
char y = 'y';
char z = 'z';
hanoi(3, x, y, z);
printf("搬運完成,總共需要搬運%d次", count);
return 0;
}
//塔座x上有按直徑由小到大且自上而下編號為1至n的n個圓盤
void hanoi(int n, char x, char y, char z)//中間的y為輔助塔,將塔座x上的n個圓盤搬到塔座z上
{
if (n == 1)
{
move(x, 1, z);//將編號為1的圓盤從x移到z
}
else
{
hanoi(n - 1, x, z, y);
move(x, n, z);
hanoi(n - 1, y, x, z);
}
}
void move(char x, int n, char z)//把第n個圓盤從塔柱x移動到塔柱z
{
printf("第%d次:把%d號圓盤從塔座%c移動到塔座%c\n",++count, n, x, z);
}