递归实现与main():
/*------------------------------------------------------
汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1,2.....n 的
圆盘从X移动到塔座Z上,要求
(1):每次只能移动一个圆盘
(2):圆盘可以插到X,Y,Z中任一塔座上
(3):任何时候不能将一个较大的圆盘压在较小的圆盘之上
初始:所有圆盘都在 X 塔座,并且最大的圆盘在最底部,然后是次大的;
结束:所有圆盘都在 Z 塔座,并且最大的圆盘在最底部,然后是次大的;
------------------------------------------------------*/
#include <iostream>
#include <ctime> // time()
using namespace std;
/*-----------------------------------------------------------
前置条件: n > 0
后置条件: 输出将n个圆盘从源塔座(orig)移动到目的塔座(dest)的步骤,
临时塔座(temp)用于临时存放。
算法(递归):
n == 1时,把盘1从源移动到目的地
n > 1时,
1)将n-1个圆盘(每次移动一个)从源移动到临时塔座
2)将盘n从源移动到目的地
3)将n-1个圆盘(每次移动一个)从临时塔座移动到目的塔座
时间复杂度: wotstTime(n) 是 O(2^n).
空间复杂度: worstSpace(n) 是 O(n).
-----------------------------------------------------------*/
void move(int n, char orig[], char dest[], char temp[])
{
static char ori = 'X', tem = 'Y', des = 'Z', ch; // 三个塔座
static int num = 0, length = n; // num记录移动步数, length保存圆盘数目
if (n <= 0){ // 处理参数传递错误
cout << "The value is error!\n";
return;
}
if (n == 1){ // 通用策略: n == 1时情况
dest[n-1] = orig[n-1];
num++;
cout << num << ") Disc " << orig[n-1] << ": "
<< ori << "-->" << des << endl;
}
else{ // 通用策略: n > 1时情况
ch = des; des = tem; tem = ch;
move(n-1, orig, temp, de