您的位置:首页 > 编程语言 > C语言/C++

C++解决八皇后问题

2013-04-09 22:24 197 查看
直接上代码,可以自己慢慢研究

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: