息止


私信TA

用户名:2194669092

访问量:1117

签 名:

等  级
排  名 12220
经  验 985
参赛次数 0
文章发表 14
年  龄 0
在职情况 学生
学  校 南昌工程学院
专  业

  自我简介:

解题思路:

#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 人评分

  评论区

  • «
  • »