C++解决八皇后问题

直接上代码,可以自己慢慢研究

#include <iostream>
#include <stdlib.h>
using namespace std;
int LineNum[9];           //第i列的皇后要放的行位置(只用其中的列号1到8)
bool a[9];                //a[i]为1表示第i行上尚未放皇后
bool b[15];               //b[i]为1表示第i条斜对角线上尚未放皇后(斜对角线指的是"/"状对角线,该对角线上各点的行列号之和i+j为一个常数)
bool c[15];               //c[i]为1表示第i条反斜对角线上尚未放皇后(反斜对角线指的是"\"状对角线,该对角线上各点的行列号之差i-j为一个常数)。
int num=0;                //计数器,用于计算方法总数
 class bahuanghou
{
     int i;
 public:
     bahuanghou(int x)
     {
     i=x;
     }
void solve(int);
};
 void bahuanghou::solve(int i)
{
int j;
for(j=1;j<9;j++)
{
    if(a[j]&&b[i+j-2]&&c[i-j+7])      //用于判断并实现:如果在第j行的第i列上放置皇后安全的话,则将一枚皇后放置到那儿。
       {
         LineNum[i]=j;                   //记录皇后位置
         a[j]=false;
         b[i+j-2]=false;
         c[i-j+7]=false;
         solve(i+1);
         a[j]=true;
         b[i+j-2]=true;
         c[i-j+7]=true;
       }
}
 if(i>8)                          //摆放皇后之后,若i=8即已放满时则递归出口;否则通过solve(i+1);进行递归调用。
   {
    num++;
    for(int m=1; m<9; m++)
        {
            for(int n=1; n<9; n++)
            {
                if(LineNum[m] == n)
                    cout<<" Q";
                else
                    cout<<" +";
            }
            cout<<endl;
        }

    for(int m=1; m<9; m++)
        {
            for(int n=1; n<9; n++)
            {
                if(LineNum[m] == n)
                {
                cout<<"("<<m<<","<<n<<")"<<"\t";
                }
            }
        }
    cout<<endl;
    //    system("pause"); //暂停以查看结果
 }
}
int main()
{
    bahuanghou huanghou(1);
    int i;
for(i=0;i<9;i++)         //初始化一个"空棋盘"
{
  a[i]=true;
}
for(i=0;i<15;i++)
{
  b[i]=true;
  c[i]=true;
}
  huanghou.solve(1);              //第1列开始的连续8列上均放上皇后
  cout<<"一共有"<<num<<"种方法。"<<endl;
  return 0;
}

 

posted @ 2013-04-09 22:24  强子~Developer  阅读(343)  评论(0编辑  收藏  举报