#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 the n
     * @return int整型
     */

    bool isValid(vector<int> &pos, int row, int col)
    {
        // 遍历所有已记录的行
        for(int i=0; i<row; ++i)
        {
            // 不能同行同列和同一斜线
            // pos下班为行号,元素为列号,即已经选择的位置;
            // 同一斜线指的是45°的斜线;
            if(row==i || col==pos[i] || abs(row-i)==abs(col-pos[i]))
                return false;
        }

        return true;
    }

    // 递归查找皇后种类
    void recursion(int n, int row, vector<int>& pos, int &res)
    {
        // 全部行都选择了位置
        if(row==n)
        {
            ++res;
            return;
        }

        // 遍历当前行的所有列,找到当前行满足条件的列;
        for(int j=0; j<n; ++j)
        {
            if(isValid(pos, row, j))
            {
                // 加入当前位置
                pos[row] = j;
                // 找到之后继续遍历下一行
                recursion(n, row+1, pos, res);
            }
        }
    }


    int Nqueen(int n) {
        // write code here
        int res = 0;
        //下标为行号,元素为列号,记录皇后位置
        vector<int> pos(n, 0);
        // 递归
        recursion(n, 0, pos, res);

        return res;
    }
};