汉罗塔汉洛塔c++,看不懂ni打我

7 篇文章 0 订阅
1 篇文章 0 订阅

汉罗塔汉洛塔c++,看不懂ni打我


大哥大姐手下留情 别打我!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GC9f81Hm-1669391569678)(C:\Users\ASUS\Desktop\汉罗塔 .在这里插入图片描述

Input
		第一行为一个正整数n

Output
		若干行,表示将n个金片从A搬到C的全过程。
		格式见样例。

		Sample Input 1
			1:A==>C

		Sample Output 3
            1:A==>C
            2:A==>B
            1:C==>B
            3:A==>C
            1:B==>A
            2:B==>C
            1:A==>C   

Hint
		n ≤ 10

总之就是 (1. 2. 3.对应下面c++代码执行步骤)

先复杂问题简单化,n层无法解决就把n先放着不管,解决n-1层
要解决n-1层,就把n-1层先放着不管…然后把1层解决了,然后解决2层…
然后解决问题。ABC(起始柱,备用柱,目标柱)随着递归调用,三个柱子的起始属性会发生变化。

1.n层先不动,等待n-1层全部移动到备用柱上 (看了下面再体会这一句)
2.然后将n层移动到目标柱上
3.此时n-1层还在备用柱上 需要把备用柱上的n-1柱子全部移动到 目标柱
要把n-1层移动到目标柱上

1.n-1层不要动,等待n-2层全部移动到备用柱上 (体会一下这里,柱子不一样喔)
2.然后将n-1移动到目标柱上
3.此时n-2还在备用柱上 需要把备用柱上的n-2个柱子全部移动到 目标柱上



.

要把2层移动到目标柱上
1.第2层不要动,将第一层全部移动到备用柱上
2.然后将第2层移动到目标柱上
3.将第一层从备用柱上 移动到目标柱上,结束

*****注意体会:每次递归调用的时候 A B C 三个柱子属性(起始柱 备用柱 目标柱) 一直在变换换 *****
看代码


#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

void han1(int n, string A, string B, string C) {
    // 只有一层的时候直接从 a==>c
	if (n == 1) {
		cout<<n<<":" << A << "==>" << C << endl;
	}else {// 有两层以上的时候
        /*1. 除底层 之外的 所有层数(n-1) 继续进行递归,直到n-1=1时候该函数递归结束
        	 递归结束后n-1层会全部移动到 中间柱B上
        */
		han1(n - 1, A, C, B);

		/*2. 经过1.操作后 此时n-1个元素已经全部移动到b柱上 
			此时A柱上只有最底层元素n 我们直接把他移动到 c柱子上
		*/ 
		cout<<n<<":" << A << "==>" << C << endl;
        
		/*3.经过1.和2.操作 此时n-1层已经移动到b柱中,n移动到A柱上
			此时的需要把 b柱上的 n-1个元素全部移动到c柱中完成移动
			所以再次递归调用
		*/ 
		han1(n - 1, B, A, C);
	}
}
int main() {
    // n表示有几层汉罗塔
	int n;
	cin>>n;
    // 调用递归函数
	han1(n, "A","B","C");
	system("pause");
	return 0;
}

我是傻逼

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值