关于汉诺塔问题的学习

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

输入格式:

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

输出格式:

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

输入样例:

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

2
a
b
c

结尾无空行

输出样例:

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

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

结尾无空行

#include<stdio.h>
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("%d\n",&n);
	scanf("%s\n%s\n%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->%s\n",m,p);//利用该函数进行输出 
 }

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值