5,530
社区成员
发帖
与我相关
我的任务
分享
// Hanoi.cpp : 定义控制台应用程序的入口点。
//
#include "stack"
#include "iostream"
using namespace std;
#include "stdlib.h"
struct Param{
int nVal;
int nRetAddress;
char cFrom;
char cTo;
char cAux;
};
void Mov(int m,char x,char y);
void simtowers(int n);
void main() {
simtowers(3);// 输入参数是盘子个数.
system("pause");
}
/* 把n个盘子from柱借助tmp柱移到to柱*/
/* 算法中未考虑进出栈异常情况 */
void simtowers( int n) {
Param currArea;
/* 堆栈数据区初始化 */
currArea.nVal = 0;
currArea.cFrom = ' ';
currArea.cTo=' ';
currArea.cAux=' ';
currArea.nRetAddress=0;
stack<Param> S;
S.push(currArea);
/* 当前工作区初始化 */
currArea.nVal =n;
currArea.cFrom = 'A';
currArea.cTo = 'C';
currArea.cAux = 'B';
currArea.nRetAddress = 1;
short int nRetAddr=-1;
/* 以下为模拟出口 */
start:
if(currArea.nVal == 1)
{
Mov(1,currArea.cFrom,currArea.cTo);
nRetAddr = currArea.nRetAddress;
currArea = S.top();
S.pop();
switch(nRetAddr)
{
case 1 :
goto lable1;
case 2 :
goto lable2;
case 3 :
goto lable3;
}
}
/* 以下模拟递归自调用过程 */
S.push(currArea);
currArea.nVal --;
swap(currArea.cTo,currArea.cAux);
currArea.nRetAddress = 2;
goto start;
/* 以下模拟返回第一次调用 */
lable2:
Mov(currArea.nVal,currArea.cFrom,currArea.cTo);
S.push(currArea);
currArea.nVal --;
swap(currArea.cFrom,currArea.cAux);
currArea.nRetAddress = 3;
goto start;
/* 以下模拟返回第二次递归调用 */
lable3:
nRetAddr = currArea.nRetAddress;
currArea = S.top();
S.pop();
switch(nRetAddr)
{
case 1 :
goto lable1;
case 2 :
goto lable2;
case 3 :
goto lable3;
}
/* 以下模拟返回主调函数 */
lable1:
return;
}
void Mov(int m,char x,char y)
{
cout <<" Mov "<<m <<" from "<<x <<" to "<<y<<endl;
}