#
# 
# @param n int整型 the n
# @return int整型
#
class Solution:
    def Nqueen(self , n ):
        num = [0 for i in range(n)]
        res = [0]
        mark = {}
        self.dfs(num,0,mark,res)
        return res[0]
    
    def dfs(self,num,i,mark,res):
        if i==len(num):
            res[0] += 1
            return 
        for j in range(len(num)):
            num[i] = j
            if self.valid(num,i,mark):
                mark[j] = i
                self.dfs(num,i+1,mark,res)
                mark[j] = -1
                
    def valid(self,num,i,mark):
        if mark.get(num[i],-1) > -1:
            return False
        for j in range(i-1,-1,-1):
            if (num[i]-num[j]== i-j) or (num[i]-num[j]==j-i) :
                return False
        return True