闲言少叙,直接开始,题目就不多说了,大家都知道。
我们先看1个的情况
我们看2个的情况:
我们看3个的情况:
我们再来看4个的情况:
大家可以来找一找相似之处:
首先是移动次数,假设有N个圆盘,就需要移动2^N-1次,
思路:我们先把所有的圆盘分成两个部分,第N个为一组,并将这一组命名为E,剩余的1~N-1为一组,并将这一组命名为F,这时候我们发现就和第二张动图的情况显示,只需要将F组移动到B柱,将E组移动到C柱,最后把F组移动到C柱,就完成了操作。然后我们的目标就是将这个F组给移动到B柱,那么我们运用递归的思想,再将第N-1个为E组,剩余的1~N-2为F组,就可以完成操作了。(这里提到的A,B,C柱就是上面动图的A,B,C柱)
操作:我们设置三个字母:X,Y,Z,X为出发点,Y为跳板,C为终点,参照第二张动图:
1.将F从A移动到B:
X---->Z---->Y
2.将E从A移动到C:
X---->Y---->Z
3.将F从B移动到C:
Y---->X---->Z
最后,我们把X看作A柱,Y看作B柱,Z看作C柱
上代码:
#include<iostream>
using namespace std;
void han(int a, char x, char y, char z) {
if (a == 1) {
cout << x << "->" << z << endl;//剩余1个的时候直接从开始的移动到结束的
}
else {
han(a - 1, x, z, y);
cout << x << "->" << z << endl;
han(a - 1, y, x, z);
}
}
int main() {
int a;
cin >> a;
han(a, 'a', 'b', 'c');
return 0;
}
本人语言表达能力不是很好,有不懂的可以私信,会及时回复,谢谢大家支持!