栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于汉诺塔问题的学习

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于汉诺塔问题的学习

给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。

输入格式:

输入由四行: 第一行是圆盘数量n(1<=n<=10); 第二行到第四行分别是三根桩柱的名字(字符串),n个盘子套在第一根桩柱上。

输出格式:

输出移动步骤,每行输出一步。

输入样例:

在这里给出一组输入。例如:

2
a
b
c

结尾无空行

输出样例:

在这里给出相应的输出。例如:

a->b
a->c
b->c

结尾无空行

#include
void output(char m[], char p[]);
void swop(int n,char m[],char p[],char q[]);
int main()
{
	char m[1000],p[1000],q[1000];
	int n;
	scanf("%dn",&n);
	scanf("%sn%sn%s",&m,&p,&q); 
	swop(n,m,p,q);
	return 0;
	
 }
 
 void swop(int n,char m[],char p[],char q[])
 {
 	if(n==1)
 	{
 		output(m,q);
	 }
	 else
	{
	 swop(n-1,m,q,p);//在该函数中,首先二三交换位置,然后一三交换位置 ,同时利用n-1 的操作将高阶的汉诺塔问题转化为低阶的问题 
	 output(m,q);
	 swop(n-1,p,m,q);
	 }//利用函数的递归调用和嵌套调用,在定义的swop函数中用到上面定义的output函数 
	 
 }
 void output(char m[],char p[])
 {
 	printf("%s->%sn",m,p);//利用该函数进行输出 
 }

刚开始的时候感觉无从下手,思考了很长时间也没有相关的思路,直到开始想到这是一个函数的嵌套过程。

一、将1上的n-1个圆盘经3的辅助转移到2上

二、将1上的n个圆盘转移到3上

三、将2上的n-1个圆盘经1转移到3上

以上分别对应函数的三部分,再进行函数对自己进行的递归调用

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290069.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号