题目描述
借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式:
输入为一个正整数N,即起始柱上的盘数。
输出格式:
每个操作(移动)占一行,按柱1 -> 柱2的格式输出。
输入样例:
3
输出样例:
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
题目中说要使用非递归方式,可是大脑一片空白,就连基本的递归方法都想了好久才搞明白,写完之后在Dev上可以很好的运行,但是提交的时候却发现最后一个测试点运行超时,不知道哪里的问题,突然想起来之前在讨论区看见学长有说过C++中cin,cout,与scanf与printf的最大区别就是运行时间后两者更短一些,于是乎就改完提交,果然没问题。
我的代码
#include<iostream>
using namespace std;
void hanoi(int n,char a,char b,char c){
if(n==1){
//cout<<a <<" -> "<< c<<endl;
printf("%c -> %c\n",a,c);
}
else{
hanoi(n-1,a,c,b);
//cout<<a <<" -> "<< c<<endl;
printf("%c -> %c\n",a,c);
hanoi(n-1,b,a,c);
}
}
int main(){
int n;
scanf("%d",&n);
hanoi(n,'a','b','c');
}
汉诺塔简单来说就是三个步骤
- 将前n-1个移动到辅助杆B上 hanoi(n-1,a,c,b)
- 将最后一个移动到目标杆C上 hanoi(1,a,b,c)
- 将前n-1个辅助杆上面的移动到目标杆上边 hanoi(n-1,b,a,c)
大概就是这个样子,辅助杆和初始杆、目标杆在移动过程中不断变化
hanoi(n,a,b,c){
hanoi(n-1,a,c,b);
hanoi(1,a,b,c);
hanoi(n-1,b,a,c);