#include <iostream>
#include <windows.h>
using namespace std;
//-----------函数声明--------------
void Instruct();
void display(int row);
void OtoTw(int n,int row);
void ThtoO(int n,int row);
void ThtoTw(n,int row);
void TwtoTh(int n,int row);
void TwtoO(int n,int row);
void ThtoTw(n,int row);
void TwtoTh(int n,int row);
void TwtoO(int n,int row);
int main()
{
//定义一个字符串类型的容器
vector<string>s(10);
s[0]=" _ ";
s[1]=" ___ ";
s[2]=" _____ ";
s[3]=" _______ ";
s[4]=" _________ ";
s[5]=" ___________ ";
s[6]=" _____________ ";
s[7]=" _______________ ";
s[8]=" _________________ ";
s[9]=" ___________________ ";
string space=" ";
vector<vector<string>>sArr;
//-------------用户界面开始-----------
Instruct();
int row; //用户选择排数
char choice; //用户选择是否继续
do
{
do
{
cout<<"Input the number of HanLuoTa's row:";
cin>>row;
sArr.resize(row);
//-------------初始化汉罗塔----------
//将第3个柱子设置为全部满,第1和2为空(space定义的那样)
for(;row;row--)
{
sArr[row].resize(3);
sArr[row][0]=s[row];
sArr[row][1]=space;
sArr[row][2]=space;
}
if(row<0||row>10){cout<<"***Error***! Out of range! Input again!\n";}
}while(row<0||row>10);
/*因为是递归函数,所以首先返回的肯定是最深层的内容。这样结实够清楚了吧?*/
display(row);
OtoTh(row,row);
cout<<endl<<endl;
cout<<"Go again or exit?\n";
"Press any key without y to come again:";
cin>>choice;if(choice=='y'||choice=='Y')b=0;
}while (b);
system("pause");
return 0;
}
//游戏说明
void Instruct()
{
cout<<"This is an old game being palyed by many years \n"
"which named HanLuoTa ! \n"
"You should just inputed a number to determine how many row \n"
"the HanLuoTa have!\n";
}
void display(int row)
//-----输出汉偌塔目前情景-----
{
for(int i=0;i<row;i++)
for(int j=0;j<3;j++)
cout<<sArr[i][j];
Sleep(1000);
system("cls");
}
row->总层数 n->转移几层
void OtoTh(int n,int row)
//1->3:将第1个柱子上的盘移动n个到第3个上
{
//--------如果移动的排数递归到不是1个盘,执行下面操作---------
if(n!=1)
{
//-----先将n-1个盘从第1个柱子移到第2个柱子上(怎么实现呢?继续下面的递归)
OtoTw(n-1);
//-----再将第n个盘(最下面的盘)移动到第3个柱子上
sArr[row-1][0].swap(sArr[n][2]);//这就是一个字符串交换的过程。
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
TwtoTh(n-1);
//显示现在情景
}
//--------如果移动的排数递归到只剩1个盘,执行下面操作(直接移动到目标盘上)---------
else sArr[row-1][0].swap(sArr[n][2]);
display(row);
}
void OtoTw(int n,int row)
//1->2:将第1个柱子上的盘移动n个到第2个上
{
//-----先将n-1个盘从第1个柱子移到第3个柱子上(怎么实现呢?继续下面的递归)
OtoTh(n-1);
//-----再将第n个盘(最下面的盘)移动到第2个柱子上
sArr[row-1][0].swap(sArr[n][1]);
//再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
ThtoTw(n-1);
//显示现在情景
display(row);
}
//---------下面的跟上面的解释差不多,整体上是一个递归函数--------
void ThtoO(int n,int row)
//3->1
{
ThtoTw(n-1);
sArr[row-1][2].swap(sArr[n][0]);
TwtoO(n-1);
display(row);
}
void ThtoTw(n,int row)
//3->2
{
ThtoO(n-1);
sArr[row-1][2].swap(sArr[n][1]);
OtoTw(n-1);
display(row);
}
void TwtoTh(int n,int row)
//2->3
{
//---------解释同上-------------
if(n!=1)
{
TwtoO(n-1);
sArr[row-1][1].swap(sArr[n][2]);
OtoTh(n-1);
}
else sArr[row-1][1].swap(sArr[n][2]);
display(row);
}
void TwtoO(int n,int row) //2->1
{
TwtoTh(n-1);
sArr[row-1][1].swap(sArr[n][0]);
ThtoO(N-1);
display(row);
}
[此贴子已经被作者于2006-5-22 23:00:02编辑过]