我没看过算法,不知道八皇后的方法
以后来看帖的,不要直接一句:编译有问题
可以看完思路,提意见,或则哪里明显错误指出
上午弄了下,编译通过了
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
//-----------函数声明--------------
void Instruct();
void display(int row);
void OtoTw(int n,int row);
void OtoTh(int n,int row);
void ThtoO(int n,int row);
void ThtoTw(int n,int row);
void TwtoTh(int n,int row);
void TwtoO(int n,int row);
vector < vector<string> > sArr;
static int one,two,three;//分别记录3个柱子上的盘子数量
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="                     ";
//-------------用户界面开始-----------
Instruct();bool b=1;
int row;          //用户选择排数
char choice;  //用户选择是否继续
do
{
      do
      {
            cout<<"Input the number of HanLuoTa's row:";
            cin>>row;
            if(row<0||row>10){cout<<"***Error***!\n Out of range! Input again!\n";continue;}
            sArr.resize(row);
            //-------------初始化汉罗塔----------
            //将第3个柱子设置为全部满,第1和2为空(space定义的那样)
            for(int i=0;i<row;i++)
            {
                    sArr[i].resize(3);
                    sArr[i][0]=s[i];
                    sArr[i][1]=space;
                    sArr[i][2]=space;
                    
             }
             one=row;two=0;three=0;
       }while(row<0||row>10);
       
       /*因为是递归函数,所以首先返回的肯定是最深层的内容。这样结实够清楚了吧?*/
       display(row);
       //cout<<sArr[0][1];
       OtoTh(row,row);
       cout<<"Go again or exit?\n"
             "Press any key to come again(y to quit):";
       cin>>choice;if(choice=='y'||choice=='Y')b=0;
}while (b);
      system("pause");
      return 0;
}
//游戏说明
void Instruct()
{
cout<<"*_*_*_*_*_Instruction_*_*_*_*_*_*\n"
      "This is an old game being palyed by many years "
      "which named HanLuoTa ! \n"
      "You should just inputed a number to determine how "
      "many rows the HanLuoTa have!\n\n"
      "***GAME BEGIN***\n";
}
void display(int row)
//-----输出汉偌塔目前情景-----
{
    Sleep(1000);
    system("cls");
    for(int i=0;i<row;i++)
    {
       for(int j=0;j<3;j++)
       {cout<<sArr[i][j];}
       cout<<endl;
    }
}
//row->总层数  n->转移几层
void OtoTh(int n,int row)                   
//1->3:将第1个柱子上的盘移动n个到第3个上
{
    //--------如果移动的排数递归到不是1个盘,执行下面操作---------
    if(n!=1)
    {
          //-----先将n-1个盘从第1个柱子移到第2个柱子上(怎么实现呢?继续下面的递归)
          OtoTw(n-1,row);
          //-----再将第n个盘(最下面的盘)移动到第3个柱子上
          sArr[row-one][0].swap(sArr[row-three-1][2]);//这就是一个字符串交换的过程。
          one--;three++;
          display(row);
          //再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
          TwtoTh(n-1,row);
          //显示现在情景
     }
//--------如果移动的排数递归到只剩1个盘,执行下面操作(直接移动到目标盘上)---------
     else 
     {
          sArr[row-one][0].swap(sArr[row-three-1][2]);
          one--;three++;
          display(row);
     }
}
void OtoTw(int n,int row)                     
//1->2:将第1个柱子上的盘移动n个到第2个上
{
    if(n!=1)
    {
       //-----先将n-1个盘从第1个柱子移到第3个柱子上(怎么实现呢?继续下面的递归)
       OtoTh(n-1,row);
       //-----再将第n个盘(最下面的盘)移动到第2个柱子上
       sArr[row-one][0].swap(sArr[row-two-1][1]);
       one--;two++;
       display(row);
        //再将第2个柱子上的n-1个盘移动到第3个柱子上(怎么实现呢?继续下面的递归)
       ThtoTw(n-1,row);
    }
    else 
    {
         sArr[row-one][0].swap(sArr[row-two-1][1]);
         one--;two++;
         //显示现在情景
         display(row);
    }
    
}
//---------下面的跟上面的解释差不多,整体上是一个递归函数--------
void ThtoO(int n,int row)                  
//3->1
{
      if(n!=1)
      {
          ThtoTw(n-1,row);
          sArr[row-three][2].swap(sArr[row-one-1][0]);
          one++;three--; 
          display(row);
          TwtoO(n-1,row);
      }
      else 
      {
           sArr[row-three][2].swap(sArr[row-one-1][0]);
           three--;one++;
           display(row);
      }
}
void ThtoTw(int n,int row)                   
//3->2
{
    if(n!=1)
    {
       ThtoO(n-1,row);
       sArr[row-three][2].swap(sArr[row-two-1][1]);
       three--;two++;
       display(row);
       OtoTw(n-1,row);
    }
    else 
    {
         sArr[row-three][2].swap(sArr[row-two-1][1]);
         three--;two++;
         display(row);
    }
}
void TwtoTh(int n,int row)              
//2->3
{
//---------解释同上-------------
    if(n!=1)
    {
          TwtoO(n-1,row);
          sArr[row-two][1].swap(sArr[row-three-1][2]);
          three++;two--;
          display(row);
          OtoTh(n-1,row);
    }
    else 
    {
         sArr[row-two][1].swap(sArr[row-three-1][2]);
         three++;two--;
         display(row);
    }
}
void TwtoO(int n,int row)                 //2->1
{
     if(n!=1)
     {
         TwtoTh(n-1,row);
         sArr[row-two][1].swap(sArr[row-one-1][0]);
         one++;two--;
         display(row);
         ThtoO(n-1,row);
     }
     else 
     {
          sArr[row-two][1].swap(sArr[row-one-1][0]);
          two--;one++;
          display(row);
     }
     
}
#include <iostream.h>
void fn(int n,char P,char T,char B);
void move(char P,char T);
void main()
{
 int n;
 char P='P';
 char T='T';
 char B='B';
 cin>>n;
 fn(n,P,T,B);
}
void fn(int n,char P,char T,char B)
{
 if(n==1)
 {
  move(P,T);
 }
 else
 {
  fn(n-1,P,B,T);
  move(P,T);
  fn(n-1,B,T,P);
 }
}
void move(char P,char T)
{
 cout<<P<<"->"<<T<<endl;
}
这个程序很好玩,费了很多时间才弄好
