题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
class Solution { public: int Nqueen(int n) { //columnindex为表示八皇后摆法的数组 //columnindex的数组下标代表第几列 //columnindex[i]=j,代表第i列的第j行摆下一枚皇后 //由于是n皇后问题,我们所需的合法样例中,n*n的棋盘必然恰好摆下n个皇后,且行列不重合 //因此,只要得到columnindex的全排列,再校验每个结果是否合法(存在斜线冲突) vector<int> columnindex; columnindex.resize(n); //初始化columnindex for(int i=0;i<n;i++){ columnindex[i]=i; } vector<vector<int>> res; permutation(columnindex,0,res,n); //本题目不要求输出n皇后的具体排布,故只输出size()即可,事实上算法获得了所有具体的排布方式 return res.size(); } //输出【无重复】元素字符串的全排列,并使用check函数审查是否是合格n皇后 void permutation(vector<int> array,int index,vector<vector<int>>& res,int n){ if(index==n){ //检查是否是合规的皇后摆法(即检查对角线) if(check(array,n)){ res.push_back(array); } return; } for(int i=index;i<n;i++){ swap(array[i],array[index]); permutation(array,index+1,res,n); swap(array[i],array[index]); } } bool check(vector<int> array,int n){ //对于每个(行坐标,列坐标) (array[i],i) for(int i=0;i<n;i++){ //检查其与(array[j],j)是否在一条斜线上,两种情况, for(int j=i+1;j<n;j++){ if((array[i]-array[j])==(i-j)){ //1 平行对角线的斜线 return false; }else if((array[i]-array[j])==(j-i)){//2 垂直对角线的斜线 return false; } } } return true; } };