汉诺塔游戏简述:
现在假设要搬动64个碟子,则我们可以考虑先将A杆上的第64个盘子,即最大的盘子放到C上,最大的盘子一旦在C杆放好,就不需去考虑了。那么如何才能将A杆的第64个盘子放到C上了?首先是将其上面的63个盘子移到B杆上,然后将第64个盘子放到C杆上。这时A为0,B为63,C为1。
此时我们换位思考下,即将B杆与A杆位置换一下,问题是不是又转化成搬动63个碟子的问题了,依次类推,直到只剩一个盘子的情况为止。
于是任务变成了:
*将A杆上面的63个盘子移到B杆上;
*将A杆上剩下的盘子移到C杆上;
*将B杆上的全部盘子移到C杆上。
以下程序是汉诺塔算法的简单演示:
有三根杆子A,B,C,A杆上有n个碟子,每次移动一块碟子,小的只能叠在大的上面(若杆子上没有碟子,可直接放上),要求把所有碟子从A杆全部移到C杆上。游戏看似简单,实际的操作步骤却相当复杂,当有n个碟子时,需要的步骤为2n-1,当n较大时,所需步骤是相当惊人的。
现在假设要搬动64个碟子,则我们可以考虑先将A杆上的第64个盘子,即最大的盘子放到C上,最大的盘子一旦在C杆放好,就不需去考虑了。那么如何才能将A杆的第64个盘子放到C上了?首先是将其上面的63个盘子移到B杆上,然后将第64个盘子放到C杆上。这时A为0,B为63,C为1。
此时我们换位思考下,即将B杆与A杆位置换一下,问题是不是又转化成搬动63个碟子的问题了,依次类推,直到只剩一个盘子的情况为止。
于是任务变成了:
*将A杆上面的63个盘子移到B杆上;
*将A杆上剩下的盘子移到C杆上;
*将B杆上的全部盘子移到C杆上。
以下程序是汉诺塔算法的简单演示:
#include
<
stdio.h
>
#include < iostream >
using namespace std;
void hanoi( int n, char A, char B, char C);
int main( void )
{
int count;
cout << "请输入碟子的数量" << endl;
cin >> count;
hanoi(count,'A','B','C');
}
void hanoi( int n, char A, char B, char C)
{
if(n == 1)
{
cout << A << " ==> "<< C << endl;
}
else
{
hanoi(n-1, A, C, B);
cout << A <<" ==> "<< C << endl;
hanoi(n-1, B, A, C);
}
}
#include < iostream >
using namespace std;
void hanoi( int n, char A, char B, char C);
int main( void )
{
int count;
cout << "请输入碟子的数量" << endl;
cin >> count;
hanoi(count,'A','B','C');
}
void hanoi( int n, char A, char B, char C)
{
if(n == 1)
{
cout << A << " ==> "<< C << endl;
}
else
{
hanoi(n-1, A, C, B);
cout << A <<" ==> "<< C << endl;
hanoi(n-1, B, A, C);
}
}