class Solution {
public:
    bool check(int x,int y,vector<vector<bool>>&f,int n)
    {
        bool fl=true;
        for(int i=1;i<=x;i++)if(f[i][y])fl=false;
        int i=x-1,j=y-1;
        while(i>=1&&i<=n&&j>=1&&j<=n)
        {
            if(f[i][j])
            {
                fl=false;
                break;
            }
            i--,j--;
        }
        i=x-1,j=y+1;
        while(i>=1&&i<=n&&j>=1&&j<=n)
        {
            if(f[i][j])
            {
                fl=false;
                break;
            }
            i--,j++;
        }
        return fl;
    }
    void dfs(int &res,vector<vector<bool>>f,int row,int n)
    {
        if(row>n)
        {
            res++;
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(check(row,i,f,n))
            {
                f[row][i]=true;
                dfs(res,f,row+1,n);
                f[row][i]=false;
            }
        }
    }
    int Nqueen(int n) {
        vector<vector<bool>>f(n+2,vector<bool>(n+2,false));
        int res=0;
        dfs(res,f,1,n);
        return res;
    }
};