解题思路:

#include<bits/stdc++.h>
using namespace std;
int A=1,B=2,C=3;
void hano(int n)
{
	int i=1;
	if(n==1)
		cout<<"Move " <<n <<" from " << A <<" to "<< C<<endl;
	else {
		swap(B , C);
		hano(n-1);
		swap(B , C);
		//第一部分,把A移到B上(其实是把上一次移动完成的C看做B,转换它们)
		cout<<"Move " <<n <<" from " << A <<" to "<< C <<endl;
		//第二部分,把最底层一块放到目标柱上
		swap(A , B);
		hano(n-1);
		swap(A , B);
		////第三部分,把B柱看做起始柱,然后完成(n-1)起始柱移动到目标驻的任务
	}
}
int main()
{
	int n,i=0;
	cin>>n
	;
	hano(n);
	return 0;
 }


注意事项:我和这位大佬的想法差不多,不过我思考的没那么清晰,看到他的说明我才豁然开朗

参考代码:

凡是递归问题都是找重复,找子问题,找变化量,找出口
找重复,我们就要划分问题,将最后一个盘子n和n-1个盘子划分开来
子问题就是求n-1个盘子如何移动
变化量就是盘子数,每次将 此时 最大的盘子n留下,将剩下的n-1移动(此n非上述n)
出口就是n等于1,最后移动最大的盘子
汉诺塔问题的难点在于:要转换各个空间的身份,包括原空间,目标空间,辅助空间
#include<iostream>using namespace std;int a[11];int n;void HanioTower(int n,int from,int to,int help){    if(n==1){        cout<<"Move "<<n<<" from "<<from<<" to "<<to<<endl;        return;    }    HanioTower(n-1,from,help,to);//先将n-1个盘子挪到辅助空间上去,此时目标空间辅助    cout<<"Move "<<n<<" from "<<from<<" to "<<to<<endl;//此时原空间剩余的最大的盘子n,就可以移到目标空间,打印输出移动操作    HanioTower(n-1,help,to,from);//让n-1从辅助空间挪到目标空间,此时原空间为辅助}int main(){    cin>>n;    HanioTower(n,1,3,2);    return 0;}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论