解题思路:
#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 人评分
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:624 |
【亲和数】 (C语言代码)浏览:493 |
1128题解(返回值为数组的情况)浏览:464 |
星期判断机 (C语言代码)浏览:859 |
前10名 (C语言代码)浏览:727 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:575 |
C语言训练-字符串正反连接 (C语言代码)浏览:632 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:483 |
三进制小数 (C语言代码)浏览:815 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:574 |