汉诺塔问题(栈和递归的实现)

前边写的数值转换是利用栈的先进后出的性质保存数字的各位数,行编辑是利用栈的只允许在一端进行操作的特性,迷宫问题中栈保存走过的通道块,栈还可以辅助递归的实现,汉诺塔就是一个典型的例子

汉诺塔问题描述:塔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; 
} 

猜你喜欢

转载自blog.csdn.net/Dear_Jia/article/details/81673829