经典的古汉诺塔问题
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);
}
}