版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39993896/article/details/78883125
/*
* Hanoi思路:用递归//栈
*假设开始柱子:A,中间柱子:B,目标柱子:C
*第一步:将n-1个盘子从A借助C移到B
*第二步:将第n个盘子从A到C
*第三步:将n-1个盘子从B借助A移到C
*
*/
//递归算法:
#include <iostream>
#include<stdio.h>
using namespace std;
void Hanoi(int plate, char A,char B,char C);
static int count;//计算移动的总次数
int main()
{
int plate;
while(cin>>plate)
{
getchar();
char start;
char depend;
char destination;
scanf("%c%*c%c%*c%c%*c",&start,&depend,&destination);//输入起始柱,中间柱和目标柱
count=0;
Hanoi(plate,start,depend,destination);
cout<<endl;
}
return 0;
}
void Hanoi(int plate, char A,char B,char C)
{
if(plate==1)
{
cout<<"第"<<++count<<"次:";
cout<<"第"<<plate<<"个盘子从"<<A<<"移到"<<C<<endl;
}
else
{
Hanoi(plate-1,A,C,B);//将n-1个从 A借助 C 移到 B
cout<<"第"<<++count<<"次:";
cout<<"第"<<plate<<"个盘子从"<<A<<"移到"<<C<<endl;//将最底下的最大盘子从A移到C
Hanoi(plate-1,B,A,C);//将B上的n-1个盘子由B借助A移到C
}
}
//栈
#include<iostream>
#include<stack>
#include<stdio.h>
using namespace std;
struct EveryTime//每次移动
{
int CurPlateNum;
char start;
char dependent;
char destination;
EveryTime(){}
EveryTime(int n, char A, char B, char C):CurPlateNum(n),start(A),dependent(B),destination(C){}
};
int main()
{
stack<EveryTime> stk;
EveryTime cur;
int n;
int count;//统计需要移动的次数
while(cin>>n)
{
getchar();
char start;
char depend;
char destination;
scanf("%c%*c%c%*c%c%*c",&start,&depend,&destination);//输入起始柱,中间柱和目标柱
count=0;
stk.push(EveryTime(n,start,depend,destination));
while(!stk.empty())
{
cur=stk.top();//用cur保存栈顶,下面用cur进行讨论
stk.pop();//弹出栈顶
if(cur.CurPlateNum==1)
{
cout<<"第"<<++count<<"次:";
cout<<"第"<<cur.CurPlateNum<<"个盘子从"<<cur.start<<"移到"<<cur.destination<<endl;
}
else//根据栈先进后出特点应该将顺序倒过来.因为递归可以独立进行,而栈先进去的元素等会晚执行
{
stk.push(EveryTime(cur.CurPlateNum-1,cur.dependent,cur.start,cur.destination));//将n-1个从B(dependent)借助A(start)移到C(destination)
stk.push(EveryTime(1,cur.start,cur.dependent,cur.destination));//将第n个由A(start)移到C(destination)
stk.push(EveryTime(cur.CurPlateNum-1,cur.start,cur.destination,cur.dependent));//将n-1个从A(start)借助C(destination)移到B(depenent)
}
}
}
return 0;
}