1. 程式人生 > >漢諾塔問題(棧和遞迴的實現)

漢諾塔問題(棧和遞迴的實現)

前邊寫的數值轉換是利用棧的先進後出的性質儲存數字的各位數,行編輯是利用棧的只允許在一端進行操作的特性,迷宮問題中棧儲存走過的通道塊,棧還可以輔助遞迴的實現,漢諾塔就是一個典型的例子

漢諾塔問題描述:塔X上的圓盤全部移動到塔Z,且移動過程中,小盤始終位於大盤上方。解決思路就是欲將n個圓盤從X移動到Z,只需先移動前n-1個圓盤到輔助塔Y,再將剩下的一個圓盤從X移動到Z,最後再以X作為輔助塔,將餘下的n-1個圓盤從Y移動到Z

Hanoi.h檔案

/********************************** 
	檔案路徑:3 棧和佇列\Hanoi
	檔名稱:Hanoi.h
	實現功能:宣告漢諾塔程式中需要用的函式
	編寫時間:2018.8.14
**********************************/

#ifndef HANOI_H
#define HANOI_H

#include<stdio.h>

int gStep;//統計移動步數(全域性變數)

//將塔座x上按直徑有小到大且自上而下編號為1至n的n個圓盤按規則搬到塔座z上,y可用作輔助塔座
void hanoi(int n,char x,char y,char z);

//把第n個圓盤從x移到z
void move(char x,int n,char z);

#endif

Hanoi.cpp檔案

/********************************** 
	檔案路徑:3 棧和佇列\Hanoi
	檔名稱:Hanoi.cpp
	實現功能:實現漢諾塔程式中需要用的函式
	編寫時間:2018.8.14
**********************************/

#ifndef HANOI_CPP 
#define HANOI_CPP

#include"Hanoi.h"

//將塔座x上按直徑有小到大且自上而下編號為1至n的n個圓盤按規則搬到塔座z上,y可用作輔助塔座
void hanoi(int n,char x,char y,char z){
	if(n==1)
		move(x,1,z);//把編號為1的圓盤從x移到z 
	else{
		hanoi(n-1,x,z,y);//把x上編號為1至n-1的圓盤移到y,z作輔助塔
		move(x,n,z);//將編號為n的圓盤從x移到z
		hanoi(n-1,y,x,z); 
	}
}

//把第n個圓盤從x移到z
void move(char x,int n,char z){
	gStep++;
	printf("Move disk %d from %c to %c\n",n,x,z);
}

#endif

Hanoi-Test.cpp檔案

/********************************** 
	檔案路徑:3 棧和佇列\Hanoi
	檔名稱:Hanoi-Test.cpp
	實現功能:測試漢諾塔演算法 
	編寫時間:2018.8.14
**********************************/

#include"Hanoi.cpp"

int main(){
	int n=5;//假設有5個圓盤 
	char x='x';
	char y='y';
	char z='z';
	
	printf("將%d個圓盤從x塔座移到z塔座的操作步驟如下:\n",n);
	hanoi(n,x,y,z);
	printf("共用了%d步\n",gStep);
	
	return 0; 
}