喜欢matlab的伙伴可以关注一波,本博也是很热爱这个语言的。
解决汉诺塔问题其实只需要递归思想就可以了。
递归思想:
1. 将a杆上的n-1个圆盘都移到空闲的b杆上,并且满足上面的所有条件
2. 将a杆上的第n个圆盘移到b上
3. 剩下问题就是将c杆上的n-1个圆盘移动到b上了
公式描述有点麻烦,用语言描述为:
1. 以b杆为中介,将前n-1个圆盘从X杆挪到c杆上(本身就是一个n-1的汉诺塔问题了!)
2. 将第n个圆盘移动到b杆上
3. 以a杆为中介,将c杆上的n-1个圆盘移到b杆上(本身就是一个n-1的汉诺塔问题了!)
假设有n个盘子,则将A柱子上的盘子移到C柱子上需要2的n次方-1.
题目简单,不多赘述。
C:
#include
int step=0;
void move(int n,char A,char B,char C){
if(n==1){step++;}//最后一个盘子归位,结束
else{
move(n-1,A,C,B);//将上面的n-1个盘子从A借助C移到B
step++;//将第n个盘子从A移到C
move(n-1,B,A,C);//再将上面的n-1个盘子从B借助A移到C
}
}
int main(){
int n;
scanf("%d",&n);
move(n,'A','B','C');//将n个盘子从A移到C(借助B)
printf("%d\n",step);
return 0;
}
C++:
#include
using namespace std;
int step=0;
void move(int n,char A,char B,char C){
if(n==1){step++;}//最后一个盘子归位,结束
else{
move(n-1,A,C,B);//将上面的n-1个盘子从A借助C移到B
step++;//将第n个盘子从A移到C
move(n-1,B,A,C);//再将上面的n-1个盘子从B借助A移到C
}
}
int main(){
int n;cin>>n;
move(n,'A','B','C');//将n个盘子从A移到C(借助B)
cout<
MATLAB:
clc;clear;
n=input('请输入n:');
hnt(n,1,2,3);%汉诺塔首拼hnt
function hnt(n,a,b,c)%a->b(借助c),与上面的有点差异,重在理解
if n==1
fprintf('把第%d号盘子从%d->%d\n',n,a,b);
else
hnt(n-1,a,c,b);
fprintf('把第%d号盘子从%d->%d\n',n,a,b);
hnt(n-1,c,b,a);
end
end
好文章记得点赞啊,让更多的伙伴看到!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)