我是一名计算机专业学生,做汉诺塔问题的非递归实现遇到了很多问题,来CSDN找到了答案,觉得这个社区非常不错,我也准备在这上面记录下我的代码历程。
这位大佬写得非常详细,我就不再画蛇添足了,大家可以去参观参观他(她)的个人博客和CSDN。
链接: link.
C++递归实现
下面展示代码。
#include<iostream>
#include<iomanip>
void hanoi(int n, char a, char b, char c);
void move(char a, char b);
using namespace std;
int main() {
int N = 0;
cin >> N;
hanoi(N, 'a', 'b', 'c');
return 0;
}
void hanoi(int n, char a, char b, char c) {
if (n == 1)
cout << a << "-->" << b << endl;
else {
hanoi(n - 1, a, c, b);
move(a, b);
hanoi(n - 1, c, b, a);
}
}
void move(char a, char b) {
cout << a << "-->" << b << endl;
}
C++非递归实现
下面展示 代码
。
#include<iostream>
#include<iomanip>
using namespace std;
int main() {
unsigned short int N{ 0 };
cin >> N;
long long int move_times{ 1 };
unsigned short int plate_number{ 1 };
long long int plate_move_times{ 1 };
long long int t{ 2 };
for (unsigned short int i{ 0 }; i < N; i++) {
move_times *= 2;
}
for (long long int i{ 1 }; i < move_times; i++) {
for (t = 2,plate_number = 1; plate_number <= N; plate_number++, t *= 2) {
if (i % t == t / 2) {
break;
}
}
plate_move_times = i / t;
if (N % 2 == plate_number % 2) {
if ((plate_move_times + 1) % 3 == 0) {
cout << "b -> a\n";
}
else if ((plate_move_times + 1) % 3 == 1) {
cout << "a -> c\n";
}
else if ((plate_move_times + 1) % 3 == 2) {
cout << "c -> b\n";
}
}
else {
if ((plate_move_times + 1) % 3 == 0) {
cout << "c -> a\n";
}
else if ((plate_move_times + 1) % 3 == 1) {
cout << "a -> b\n";
}
else if ((plate_move_times + 1) % 3 == 2) {
cout << "b -> c\n";
}
}
}
return 0;
}
需要注意的是数据类型,有的需要定义为 long long (int)才会符合要求。
然后就是时间限制的问题,在c++中的输出流cout 和 endl 耗时会比较长,有两个解决方案,要么解绑,要么使用c的输出方法。可惜我都不会。。。