递归篇--

经典的古汉诺塔问题
C++大一上实验题:
题目描述
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这n个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。

输入
输入盘子个数n
输出
输出盘子最少移动的步骤
样例输入
3
样例输出
1:A->C
2:A->B
3:C->B
4:A->C
5:B->A
6:B->C
7:A->C
题解:

#include<iostream>
using namespace std;
int step=1;
void move(char x,char y)
{
	cout<<step++<<":"<<x<<"->"<<y<<endl;
}
void han(int n,char a,char b,char c)
{
	if(n==1)
	move(a,c);//若只有一个,则A->C即可
	else{
	//若大于一个盘子,可以两个盘子为例,拆解为四步
		han(n-1,a,c,b);//先将A中最后一个大盘子的碟子:A->B
		move(a,c);//再将A中最后一个大盘子:A->C
		han(n-1,b,a,c);//再将B中所有盘子:B->C
	}
}
int main()
{
	int n;
	cin>>n;
	han(n,'A','B','C');
	return 0;
}

leedcode中遇到的:
两题思路是一样的
在这里插入图片描述

class Solution{
public:
    void hanota(vector<int>& A,vector<int>& B,vector<int>& C){
        int n=A.size();
        move(n,A,B,C);
    }
    
    void move(int n,vector<int>& A,vector<int>& B,vector<int>& C){
        if(n==1)
        {
            C.push_back(A.back());
            A.pop_back();
            return;
        }
        move(n-1,A,C,B);
        C.push_back(A.back());
        A.pop_back();
        move(n-1,B,A,C);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值