解题思路:
#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 人评分