汉诺塔问题 描述:假设有n个碟子和三座塔。初始时所有的碟子从大到小叠在第一座塔上,现在需要将所有的碟子移动到第二座塔上,每一次移动一个碟子,而且在任何时候大碟子都不能放在小碟子上面。在移动的过程中,可以借助第三座塔。
求解思路:采用递归的思路解决问题,为了将最大的碟子移动到第二座塔上面,我们需要将最上面n-1个碟子移动到第三座塔上面。然后,我们需要做的又是将第三座塔中最大的碟子移动到第二座塔上面,这时,需要将最上面n-2个碟子移动到第一座塔,然后将最大的碟子移动到第二座塔。
C++代码思路:
void towersOfHanoi(int n,int x,int y,int z)
{
if(n>0)
{
towersOfHanoi(n-1,x,z,y);
cout<<"将最大的盘子从"<<x<<"移动到"<<y<<endl;
towersOfHanoi(n-1,z,y,x);
}
}
现在我们用栈保存每一座塔中的数据,并用整型数据1到n对所有的碟子进行编号。初始化操作是将所有的碟子按大到小的顺序进去第一座塔栈,其他两座塔栈为空。
//全局变量,定义三座塔栈,tower[1],tower[2],tower[3]分别表示三座塔栈
arrayStack<int> tower[4];
void moveAndShow(int,int,int,int);
void towersOfHanoi(int n)
{
//塔一初始化
for(int i=n;i>0;i--)
{
tower[1].push(i);
}
//将n个碟子从第一个塔移动到第三个塔栈,第二个塔栈作为中转站
moveAndShow(n,1,2,3);
}
void moveAndShow(int n,int x,int y,int z)
{
if(n>0)
{
moveAndShow(n-1,x,z,y);
int temp = tower[x].top();
tower[x].pop();
tower[y].push(temp);
/*此处可以遍历任何一座汉诺塔,并打印出塔中的值*/
moveAndShow(n-1,z,y,x);
}
}