回溯

N 皇后

困难#51Java时间 O(n·n!),粗略上界,不计输出复制空间 O(n²),不计结果

题目要做什么

在 n×n 棋盘放置 n 个皇后,任何两个不能同行、同列或同斜线。返回全部棋盘方案。

题目示例输入n = 4
题目示例输出[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]

01 为什么这样做

每行只放一个皇后。用列、r−c+n−1 和 r+c 三组布尔标记快速检查冲突。放置后进入下一行,返回后撤销棋盘和占用标记。

始终成立的条件

前 row 行各有一个皇后,所有已放皇后互不攻击。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<List<String>> solveNQueens(int n) {3        char[][] board = new char[n][n];4        for (char[] row : board) Arrays.fill(row, '.');5        List<List<String>> result = new ArrayList<>();6        search(0, board, new boolean[n], new boolean[2*n-1], new boolean[2*n-1], result);7        return result;8    }9    private void search(int row, char[][] board, boolean[] columns, boolean[] down, boolean[] up, List<List<String>> result) {10        int n = board.length;11        if (row == n) {12            List<String> solution = new ArrayList<>();13            for (char[] line : board) solution.add(new String(line));14            result.add(solution);15            return;16        }17        for (int col = 0; col < n; col++) {18            int d = row - col + n - 1, u = row + col;19            if (columns[col] || down[d] || up[u]) continue;20            board[row][col] = 'Q';21            columns[col] = down[d] = up[u] = true;22            search(row + 1, board, columns, down, up, result);23            board[row][col] = '.';24            columns[col] = down[d] = up[u] = false;25        }26    }27}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索