N-Queens

add better solutions here

N-Queens I, 维护一个list, list[i]代表了这个queen是在第i行的第list[i]列的,每次在把一个新的queen加进去前判断一下,加入后会不会引起棋盘的invalid。 invalid的条件在这里是有两个queen在同一列,在同一个45度对角线,在同一个135度对角线。 同一45度对角线的两个queen, row1 + col1 == row2 + col2。 在同一135度对角线的两个queen, row1 - col1 = row2 - col2。

这道题我一开始做错了,原因是我维护了一个pos变量,把这题当成一个combination类的变形,其实这题是permutation类的变形,每次for循序的起始index都是0。

public class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<List<String>>();
        if (n <= 0) {
            return result;
        }

        List<Integer> list = new ArrayList<Integer>();
        dfs(result, list, n);
        return result;
    }

    private void dfs(List<List<String>> result, List<Integer> list, int n) {
        if (list.size() == n) {
            result.add(build(list, n));  
            return;
        }

        for (int i = 0; i < n; i++) {
            if (!isValid(list, i)) {
                continue;
            }

            list.add(i);
            dfs(result, list, n);
            list.remove(list.size() - 1);
        }
    }

    private List<String> build(List<Integer> list, int n) {
        List<String> board = new ArrayList<String>();
        for (int i = 0; i < n; i++) {
            StringBuffer sb = new StringBuffer();
            int col = list.get(i);
            for (int j = 0; j < n; j++) {
                if (j == col) {
                    sb.append("Q");
                } else {
                    sb.append(".");
                }
            }
            board.add(sb.toString());
        }

        return board;
    }

    private boolean isValid(List<Integer> list, int col) {
        int row = list.size();

        for (int i = 0; i < list.size(); i++) {
            int row2 = i, col2 = list.get(i);

            if (col == col2) {
                return false;
            }
            if (row + col == row2 + col2) {
                return false;
            }
            if (row - col == row2 - col2) {
                return false;
            }
        }

        return true;
    }
}

N-Queens II, 这题虽然是返回有多少种可能性,但是其实并不能用dp来解,还是要用dfs去搜。

public class Solution {
    public int totalNQueens(int n) {
        if (n <= 0) {
            return 0;
        }

        List<Integer> list = new ArrayList<Integer>();
        return dfs(list, n);
    }

    private int dfs(List<Integer> list, int n) {
        if (list.size() == n) {
            return 1;
        }

        int sum = 0;
        for (int i = 0; i < n; i++) {
            if (!isValid(list, i)) {
                continue;
            }

            list.add(i);
            sum += dfs(list, n);
            list.remove(list.size() - 1);
        }

        return sum;
    }

    private boolean isValid(List<Integer> list, int col) {
        int row = list.size();

        for (int i = 0; i < list.size(); i++) {
            int row2 = i, col2 = list.get(i);

            if (col == col2) {
                return false;
            }
            if (row + col == row2 + col2) {
                return false;
            }
            if (row - col == row2 - col2) {
                return false;
            }
        }

        return true;
    }
}

results matching ""

    No results matching ""