第二次做,还是不能流畅做出来。

针对每一列进行防止判断,使用递归进行下一层(行)放置

class Solution {
  public:
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
  //  每一行只放置一个,所以可以建立行与列之间的映射关系
    int Nqueen(int n) {
      int res = 0;
      std::vector<int> pos(n, -1);
      
      recursion(n, pos, res, 0);
      
      return res;
    }
  private:
  // row的有效范围为 0 ~ n-1
    void recursion(const int &n, std::vector<int> &pos, int &res, int row) {
      if (row == n) {
        ++res;
        return ;
      }
      //  针对每一列判断
      //  递归增加行数
      for (int i = 0; i < n; ++i) {
        if (able_push(pos, row, i)) {
          pos[row] = i;
          recursion(n, pos, res, row + 1);
        } 
      }
    }
  
  bool able_push(const std::vector<int> &pos, int row, int col) {
    //  对已经放置过的每一行遍历,查找是否能放置
    for (int i = 0; i < row; ++i) {
      if (pos[i] == col || std::abs(i - row) == std::abs(pos[i] - col)) {
        return false;
      }
    }
    
    return true;
  }
};