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; }