n皇后问题采用回溯算法可以解决。回溯的可以采取递归和迭代两种方式实现。n皇后的约束函数是Place(int x,int s)。 具体的递归代码和迭代代码如下: #include <iostream> #include <cmath> using namespace std; class Queen { public: Queen(int nn); ~Queen(); void backTrack(int i);//递归方法求答案 void backTrack();//迭代回溯 void printSum()const{cout<<"sum:"<<sum;} private: int n;//有几个皇后 int *x;//答案数组 int sum;//答案个数 bool place(int,int)const;//判断某个位置是否可用; void printResult()const;//打印结果 }; Queen::Queen(int nn) { n=nn; x=new int[n+1]; sum=0; } Queen::~Queen() { delete []x; } void Queen::printResult()const { for(int i=1;i<=n;i++) { cout<<x[i]<<" "; } cout<<endl; } bool Queen::place(int i,int k)const//判断第k个皇后能不能在第i个位置,即x[k]能不能得i { for(int kk=1;kk<k;kk++) //第k个皇后之前的皇后依次遍历 第kk个皇后占着第x[kk]列 x[kk] { if(abs(k-kk)==abs(x[k]-x[kk])||x[kk]==x[k])return false; } return true; } void Queen::backTrack(int k) { if(k>n) //终止条件 { sum++; printResult(); } else { for(int i=1;i<=n;i++) //让第k个皇后依次试第i个位置 如果可以就放在那 然后处理下一个皇后 { x[k]=i; if(place(i,k))backTrack(k+1); } } } void Queen::backTrack() { int k=1; x[k]=0; while(k>0) { x[k]++; while(!place(x[k],k)&&x[k]<=n)x[k]++;//为第k个皇后找个位置,如果没有x[k]就会超过n if(x[k]<=n)//说明为第k个皇后找到了一个位置x[k] { if(k==n) { sum++; printResult(); } else { k++; //下一个皇后 x[k]=0; } } else //说明找了一遍都没有给第k 个皇后找到个位置, k--; //就往上走一步 } } int main() { Queen q(4); q.backTrack(); q.printSum(); return 1; } 以上采用了课本上的代码,通过一个类来实现。