C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式

来源:互联网 发布:php商城源码免费下载 编辑:程序博客网 时间:2024/05/16 07:41
#include <iostream>
using namespace std;
class Queen{
public:
 Queen(){}
 Queen(int i):Qnum(i){}
 ~Queen(){}
 void SetQnum(int i){
  Qnum=i;
 }
 void FindPos();
private:
 enum{MAX=10};
 int col[MAX];
 int M[2*MAX];
 int S[2*MAX];
 int matrix[MAX][MAX];
 int Qnum;
 int count;
 void Find(int i);
 void Init();
};
void Queen::FindPos(){
 Init();
 Find(0);
}
void Queen::Init(){
 count=0;
 for(int i=0;i<MAX;++i){
  col[i]=0;
  for(int j=0;j<MAX;++j)matrix[i][j]=0;
 }
 for(i=0;i<2*MAX;++i)M[i]=S[i]=0;
}
void Queen::Find(int i){
 for(int j=0;j<Qnum;++j){
  if(col[j]==0&&M[i-j+Qnum-1]==0&&S[i+j]==0){//列、主对角线、辅对角线,-1起标示作用在矩阵中表示放皇后的位置
   col[j]=-1;
   M[i-j+Qnum-1]=-1;
   S[i+j]=-1;
   matrix[i][j]=-1;
   if(i<Qnum-1)Find(i+1);
   else{
    cout<<"No."<<++count<<" result:"<<endl;
    for(int iL=0;iL<Qnum;++iL){
     for(int jC=0;jC<Qnum;++jC)
      cout<<matrix[iL][jC]<<'\t';
     cout<<endl;
    }
    cout<<endl;
   }
   col[j]=0;
   M[i-j+Qnum-1]=0;
   S[i+j]=0;
   matrix[i][j]=0;
  }
 }
}
int main(){
 cout<<"Input the num of queen:"<<endl;//暂时只处理4、8皇后
 int num;
 cin>>num;
 Queen obj(num);
 obj.FindPos();
 return 0;
}