package main

/**
 * 
 * @param n int整型 the n
 * @return int整型
*/
func Nqueen( n int ) int {
    // write code here
	res := make([][]string, 0)
	var dfs func(total int, currLevel int, tmp []int)
	dfs = func(total int, currLevel int, tmp []int) {
		if currLevel == total {
			strs := make([]string, 0)
			for row := 0; row < total; row++ {
				str := ""
				for col := 0; col < total; col++ {
					if col == tmp[row] {
						str += "Q"
					} else {
						str += "."
					}
				}
				strs = append(strs, str)
			}
			res = append(res, strs)
			return
		}
		//每层从第一个开始放
		for i := 0; i < total; i++ {
			tmp[currLevel] = i
			//是否符合条件
			if isPass(currLevel, tmp) {
				dfs(total, currLevel+1, tmp)
			}
		}
	}
	tmp := make([]int, n)
	dfs(n, 0, tmp)
	return len(res)
}


func isPass(currLevel int, arr []int) bool {
	for i := 0; i < currLevel; i++ {
		if arr[currLevel] == arr[i] || (abs(currLevel, i) == abs(arr[currLevel], arr[i])) {
			return false
		}
	}
	return true
}

func abs(a, b int) int {
	if a > b {
		return a - b
	}
	return b - a
}