Loading

N皇后问题的实现

实现方案

方案一:递归法

    public List<List<String>> solveNQueens(int n) {
        char[][] queen = new char[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                queen[i][j] = '.';
            }
        }
        List<List<String>> res = new ArrayList<>();
        solve(res, queen, 0);
        return res;
    }

    public void solve(List<List<String>> res, char[][] queen, int row){
        if (row == queen.length){
            res.add(construct(queen));
        }
        //注意递归中的分支污染
        for (int col = 0; col < queen[0].length; col++) {
            if (valid(queen, row, col)){
                char[][] temp = copy(queen);
                temp[row][col] = 'Q';
                solve(res, temp, row+1);
            }
        }
    }

    public boolean valid(char[][] queen, int row, int col){
        for (int i = 0; i < row; i++) {
            if (queen[i][col] == 'Q') return false;
        }
        for (int i = row-1, j = col+1; i >= 0 && j < queen[0].length; i--, j++){
            if (queen[i][j] == 'Q') return false;
        }
        for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
            if (queen[i][j] == 'Q') return false;
        }
        return true;
    }

    public char[][] copy(char[][] queen){
        int row = queen.length;
        int col = queen[0].length;
        char[][] temp = new char[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                temp[i][j] = queen[i][j];
            }
        }
        return temp;
    }

    public List<String> construct(char[][] queen){
        int n = queen.length;
        List<String> path = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            path.add(new String(queen[i]));
        }
        return path;
    }

方案二:回溯法

    public List<List<String>> solveNQueens(int n) {
        char[][] queen = new char[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                queen[i][j] = '.';
            }
        }
        List<List<String>> res = new ArrayList<>();
        solve(res, queen, 0);
        return res;
    }

    public void solve(List<List<String>> res, char[][] queen, int row){
        if (row == queen.length){
            res.add(construct(queen));
        }
        //回溯避免递归分支污染
        for (int col = 0; col < queen[0].length; col++) {
            if (valid(queen, row, col)){
                queen[row][col] = 'Q';
                solve(res, queen, row+1);
                queen[row][col] = '.';
            }
        }
    }

    public boolean valid(char[][] queen, int row, int col){
        for (int i = 0; i < row; i++) {
            if (queen[i][col] == 'Q') return false;
        }
        for (int i = row-1, j = col+1; i >= 0 && j < queen[0].length; i--, j++){
            if (queen[i][j] == 'Q') return false;
        }
        for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
            if (queen[i][j] == 'Q') return false;
        }
        return true;
    }

    public char[][] copy(char[][] queen){
        int row = queen.length;
        int col = queen[0].length;
        char[][] temp = new char[row][col];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                temp[i][j] = queen[i][j];
            }
        }
        return temp;
    }

    public List<String> construct(char[][] queen){
        int n = queen.length;
        List<String> path = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            path.add(new String(queen[i]));
        }
        return path;
    }

参考

posted @ 2021-04-14 11:24  JesseKkk  阅读(69)  评论(0)    收藏  举报