import java.util.*;


public class Solution {
    /**
     *
     * @param n int整型 the n
     * @return int整型
     */

    static int cnt = 0;

    public int Nqueen (int n) {
        // write code here
        int[][] board = new int[n][n];
        cnt = 0;
        dfs(board, 0, n);
        return cnt;
    }

    public void dfs(int[][] board, int i, int n) {

        if (i >= n) {
            cnt++;
            return;
        }

        for (int j = 0; j < n; j++) {
            if (isValid(board, i, j)) {
                // 放棋子
                board[i][j] = 1;
                dfs(board, i + 1, n);
                // 复原
                board[i][j] = 0;
            }
        }
    }

    // 判断皇后摆在(x,y)是否合法
    public boolean isValid(int[][] board, int x, int y) {

        int n = board.length;

        for (int i = 0; i < n; i++) {
            if (board[i][y] == 1) {
                return false;
            }
        }

        for (int j = 0; j < n; j++) {
            if (board[x][j] == 1) {
                return false;
            }
        }

        for (int i = 1; i <= n; i++) {
            if (x - i >= 0 && y - i >= 0 && board[x - i][y - i] == 1) {
                return false;
            }

            if (x + i < n && y - i >= 0 && board[x + i][y - i] == 1) {
                return false;
            }

            if (x - i >= 0 && y + i < n && board[x - i][y + i] == 1) {
                return false;
            }

            if (x + i < n && y + i < n && board[x + i][y + i] == 1) {
                return false;
            }
        }

        return true;
    }

    // 打印棋盘,以供检查
    public void printBoard(int[][] board,int n) {
        for (int k = 0; k < n; k++) {
            for (int l = 0; l < n; l++) {
                System.out.print(board[k][l] + " ");
            }
            System.out.println();
        }
    }
}