永发信息网

C++之汉诺塔问题

答案:6  悬赏:0  手机版
解决时间 2021-06-06 13:17

汉诺塔问题。这是一个古典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只许移动一个盘子,且在移动过程中在3个座上都始终保持大盘子在下,小盘子在上。在移动过程中可以利用B座,要求编程序打印移动的步骤。

这道题主要考察的是递归,貌似还要用到指针,但我们还没有学过指针,我的问题就是在不用指针的情况下,能不能做出这道题?!

怎么做?

最佳答案

采用递归调用就行:


#include<iostream>
using namespace std;


void move(char getone,char putone)
{
cout<<getone<<"-->"<<putone<<endl;
}
void hanoi(int n,char one,char two,char three)
{
void move(char getone,char putone);
if(n==1)move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}


int main()
{
void hanoi(int n,char one,char two,char three);
int m;
cout<<"请输入盘子的数量:";
cin>>m;
cout<<"移动"<<m<<"个盘子的步骤:"<<endl;
hanoi(m,'A','B','C');
}


运行结果:


全部回答

#include<iostream> using namespace std; int sum=0; void hanoi(char a,char b,char c,int n) { if(n==1) { cout<<a<<"->"<<c<<endl; } else { hanoi(a,c,b,n-1); cout<<a<<"->"<<c<<endl; sum=sum+2;

hanoi(b,a,c,n-1); } } int main() { int n; cout<<"输入碟子数:"; cin>>n; hanoi('A','B','C',n); cout<<sum+1<<endl;

}

#include <fstream> #include <iostream> using namespace std; ofstream fout(“out.txt”); void Move(int n,char x,char y) { fout<<“把”<<n<<“号从”<<x<<“挪动到”<<y<<endl; } void Hannoi(int n,char a,char b,char c) { if(n==1) Move(1,a,c); else { Hannoi(n-1,a,c,b); Move(n,a,c); Hannoi(n-1,b,a,c); } } int main() { fout<<“以下是7层汉诺塔的解法:”<<endl; Hannoi(7,‘a’,‘b’,‘c’); fout.close(); cout<<“输出完毕!”<<endl; return 0; }

这个能行的, 比较简单明了。

汉诺塔是一个经典的递归问题 不需要用到指针的 递归思想就是 如果只有一个盘子 那么 把盘子直接移到目的柱 有两个盘子 把最上面一个移动到中间柱 把最下面的一个移动到目的柱 然后把中间的移动到目的柱 当规模为n的时候也就是这样的递归思想 把上面的n-1个移动到中间柱 把最后一个移动到目的柱 然后再把n-1个移动到目的柱 我只把思想给你解释一下 至于代码 这么经典的程序 网上多的是 去找找就有了
我没研究过汉诺塔,但是C/C++有很多时候是可以用数组来解决问题而避免使用指针的。

#include<iostream>

using namespace std;

int main()

{

void hanoi(int n,char one,char two,char three);

int m;

cout<<"input the number of diskes:";

cin>>m;

cout<<"The step to moving"<<m<<"diskes:"<<endl;

hanoi(m,'A','B','C');

return 0;

}

void hanoi(int n,char one,char two ,char three)

{

void move(char x,char y);

if(n==1)

move(one,three);

else

{

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

void move(char x,char y)

{

cout<<x<<"--->"<<y<<endl;

}

没有使用指针,符合你的要求,呵呵

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
QQ音速谁能送我10个音速种子有急用,现谢谢了
在哪里下绑马器?更加进一步了解木马
塑料ABS怎样才能不会断
那里建的小区多?|
花之神匠是什么级别?
爱上一个网络男生,我该放弃吗?
地下城附魔技能在那能学习?
谁能给我白金版的全部攻略
让胡路区大庆韵达(东湖服务站)地址在什么地方
关于信用卡!!!
急求房屋屋顶建筑学名词
他们算网恋吗
杞县开封北关药店在什么地方啊,我要过去处理
怎样把雀斑除掉
NOKIA3500C的手机质量好吗?
推荐资讯
鹿邑县周口特色烤冷面这个地址怎么能查询到,
求SHE-梦田歌词链接?
诺基亚的机子好用还是多普达的机子好用?
地下陈dinput8.dll
打了甲流疫苗后就感冒了,还要不要重新打一次
为什么上课静不下来?
谁长时间呆在过塔里木盆地,可以谈谈你的感受
AVA好玩吗?现在还要激活吗?
上蔡县驻马店中国工商银行(蔡都支行)在什么地
如何在线通过摄像头录制 制作游戏视频 ??
NIKE的FZT Triax模拟和FZT Triax Swaper现在
关于让步状语从句的句子看看吧
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?