在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,这就是八皇后问题。有人用图论的方法解出共有92种摆法,这里用c++实现: #include <iostream> using namespace std; class EightQueens{ public: EightQueens(int sum); virtual ~EightQueens(); bool Isvalid(int col, int row); void Print(); void Queen(int num); private: char **m_chess; int ProgramNum; //方案数 int QueenNum; //皇后数 enum flag{blank='X',queen='O'}; }; EightQueens::EightQueens(int total) { m_chess=new char*[total]; for (int i=0; i<total; ++i) { m_chess[i]=new char[total]; } for (i=0; i<total; ++i) { for (int j=0; j<total; ++j) { m_chess[i][j]=blank; } } ProgramNum=0; QueenNum=total; } EightQueens::~EightQueens() { for (int i=0; i<QueenNum; ++i) { delete []m_chess[i]; } delete []m_chess; } void EightQueens::Print() { Queen(0); } bool EightQueens::Isvalid(int col, int row) { int i; for (i=0; i<row; ++i) //同行冲突 { if (m_chess[col][i]==queen) { return false; } } for (i=1; col>=i && row>=i; ++i) //左上对角冲突 { if (m_chess[col-i][row-i]==queen) { return false; } } for (i=1; col+i<QueenNum && row>=i; ++i) //左下对角冲突 { if (m_chess[col+i][row-i]==queen) { return false; } } return true; } void EightQueens::Queen(int num) { if(num==QueenNum) { ProgramNum++; cout<<"第"<<ProgramNum<<"种方案为:"<<endl; for (int i=0; i<QueenNum; ++i) { for (int j=0; j<QueenNum; ++j) { cout<<m_chess[i][j]<<" "; } cout<<endl; } } else { for(int i=0; i<QueenNum; ++i) if (Isvalid(i,num)) { m_chess[i][num]=queen; Queen(num+1); m_chess[i][num]=blank; } } } int main() { cout<<"输入皇后个数n(n<=20):"; int n; cin>>n; if(n>20) cout << "n的值太大,不能求解!"<<endl; else { EightQueens que(n); que.Print(); } return 0; } 另附网上一种解法: #include <iostream> using namespace std; const int N = 20; //最多放置皇后个数 int q[N]; //存放皇后所在的行号 int count = 0; //存放解的个数 void Print(int n) //输出一个解 { count++; int i; cout << " 第" << count << " 个解:"; for(i=1; i<=n; i++) cout << "(" << i << "," << q[i] << ")"; cout << endl; } bool Place(int i, int k) //测试第k列的i行上能否摆放皇后 { int j; j = 1; while(j < k) //j=1到k-1是已经旋转了皇后的列 { if((q[j]==i) || (abs(q[j]-i)==abs(j-k)))//第j列皇后是否在i行上。位置(q[j],j)与(i,k)是否同对角线 return false; j++; } return true; } void Queens(int k, int n) //第k个皇后放到第k列上 { if(k>n) Print(n); //所有皇后放置结束 else for(int i=1; i<=n; i++) //在第k列上穷举每一个位置 if(Place(i, k)) { q[k] = i; Queens(k+1, n); //放置余下的皇后 } } int main() { int n; //n存放实际皇后个数 cout << "皇后问题(n<20) n:"; cin >> n; if(n>20) cout << "n的值太大,不能求解/n"; else { cout << "皇后问题求解如下:" << endl; Queens(1,n); cout << endl; } return 0; }