N后问题(回溯法)

      N后问题要求在以个nxn格的棋盘上放置n个皇后,使得它们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一条斜线上的其他任何棋子。因此,n后问题等价于要求在一个nxn格的棋盘上放置n个皇后,使得任何2个皇后不能被放在同一行或同一列或同一条斜线上。#include<iostream> #include<math.h> #include<time.h> using namespace std; class Queen { friend int nQueen(int); private: bool place(int k); void backtrack(int t); void swap(int &i,int &j); int n; int *x; int sum; }; void Queen::swap(int &a,int &b) { int temp; temp=a; a=b; b=temp; } bool Queen::place(int k) { for(int j=1;j<k;j++) if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; } void Queen::backtrack(int t) { if(t>n) sum++; else for(int i=t;i<=n;i++) { swap(x[t],x[i]); if(place(t)) backtrack(t+1); swap(x[t],x[i]); } //cout<<sum<<endl; } int nQueen(int n) { Queen X; X.n=n; X.sum=0; int t=1; int *p=new int[n+1]; for(int i=0;i<=n;i++) p[i]=i; X.x=p; X.backtrack(t); delete []p; return X.sum; } int main() { //clock_t use_time; int n; cout<<“请输入皇后数:”<<endl; cin>>n; cout<<“皇后数为:”<<n<<endl; cout<<nQueen(n)<<endl; cout<<“耗时为:”<<endl; cout<<clock()/(long)CLK_TCK<<endl; return 1; }

    原文作者:回溯法
    原文地址: https://blog.csdn.net/weixiaoshashou/article/details/4950938
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞