#include <algorithm> #include <unordered_set> #include <vector> class Solution { public: /** * * @param n int整型 the n * @return int整型 */ // 该题意味每行必须都有一个皇后 // 可变数组 未放入皇后的禁区 vector<int> unRoad1,unRoad2; vector<int> unCol; int res = 0; int Nqueen(int n) { // write code here compute(0, n); return res; } bool find(int key,vector<int> vec){ vector<int>::iterator rest= std::find(vec.begin(),vec.end(),key); if(rest==vec.end()) return false; return true; } void compute(int i, int n) { // 如果访问完了n行,意味着把个皇后插入进去了 int y = 0; if (i == n) { res++; } else { //把第i行的所有元素进行深度优先遍历 for (int j = 0; j < n; j++) { // 接下来的皇后不能触碰已经存在皇后的行、列、对角线 if (!find(j,unCol)&&!find(i-j, unRoad1)&&!find(i+j, unRoad2)) { // 当前顶点符合要求,把他的行、列、对角线加入集合 unCol.push_back(j); unRoad1.push_back(i - j); unRoad2.push_back(i + j); //回溯 compute(i + 1, n); // 深度遍历改点后,擦除痕迹,继续遍历第i行其他元素 unCol.pop_back(); unRoad1.pop_back(); unRoad2.pop_back(); } } } return; } };