问题描述:
有一个梵塔,塔内有三个座A、B、C,A 座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。把这些个盘子从 A 座移到 C 座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3 个座上的盘子始终保持大盘在下,小盘在上。
汉诺塔-递归
#include <iostream>
#include <cstdlib>
using namespace std;
void move(char x, int n, char y) {
cout << "把编号为" << n << "的盘从" << x << "移到" << y << endl;
}
void hanoi(int N, char A, char C, char B) {
if(N == 1) {
move(A, 1, B);
} else {
hanoi(N-1, A, B, C);
move(A, N, B);
hanoi(N-1, C, A ,B);
}
}
int main() {
cout << " ------汉诺塔递归实现------\n" << endl;
cout << "说明:利用C塔将盘子从A塔移到B塔\n" << endl;
cout << "请输入A塔盘子的个数:";
int n = 1;
cin >> n;
cout << "移动步骤:" << endl;
hanoi(n, 'A', 'C', 'B');
system("PAUSE");
return 0;
}
汉诺塔-非递归
#include <iostream>
#include <cstdlib>
using namespace std;
static void hanoi(int n) {
int fromPole, toPole, Disk;
int *BitStr = new int[n],*Hold = new int[n];
char Place[] = {'A', 'B', 'C'};
int i, j, temp;
for(i=0; i < n; i++) {
BitStr[i] = 0;
Hold[i] = 1;
}
temp = 3 - (n % 2);
int TotalMoves = (1 << n) - 1;
for (i=1; i <= TotalMoves; i++) {
for (j=0 ; BitStr[j] != 0; j++) {
BitStr[j] = 0;
}
BitStr[j] = 1;
Disk = j+1;
if (Disk == 1) {
fromPole = Hold[0];
toPole = 6 - fromPole - temp;
temp = fromPole;
} else {
fromPole = Hold[Disk-1];
toPole = 6 - Hold[0] - Hold[Disk-1];
}
cout << "把编号为" << Disk << "的盘子从" << Place[fromPole-1]
<< "移到" << Place[toPole-1] << endl;
Hold[Disk-1] = toPole;
}
}
int main() {
cout << " ------汉诺塔非递归实现------: \n" << endl
<< "说明:利用塔C将盘子从塔A移到塔B\n" << endl;
cout << "请输入A塔的盘子个数: ";
int n;
cin >> n;
hanoi(n);
system("PAUSE");
return 0;
}