文章

每日LeetCode 240

2021.10.11 ・ 共 491 字,您可能需要 1 分钟阅读

Tags: LeetCode

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-queens 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    List<List<String>> ans = new ArrayList<>();

    public List<List<String>> solveNQueens(int n) {
        //. 代表未放置 Q 代表放置
        char[][] panel = new char[n][n];
        for (char[] c : panel) {
            Arrays.fill(c, '.');
        }
        backTrack(n, 0, panel);
        return ans;
    }

    public boolean isValid(char[][] panel, int row, int col) {
        //横行
        for(int i = 0; i < panel.length; i++) {
            if (panel[row][i] == 'Q') {
                return false;
            }
        }
        //纵行
        for(int i = 0; i < panel.length; i++) {
            if (panel[i][col] == 'Q') {
                return false;
            }
        }
        // 左上
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (panel[i][j] == 'Q') {
                return false;
            }
        }

        // 右上
        for (int i = row - 1, j = col + 1; i >= 0 && j < panel.length; i--, j++) {
            if (panel[i][j] == 'Q') {
                return false;
            }
        }   
        return true;
    }

    public void backTrack(int n, int row, char[][] panel) {
        if (row == n) {
            ans.add(array2list(panel));
            return;
        }
        for (int col = 0; col < n; col++) {
            if (isValid(panel, row, col)) {
                panel[row][col] = 'Q';
                backTrack(n, row + 1, panel);
                panel[row][col] = '.';
            }
        }
    }

    public List array2list(char[][] panel) {
        List<String> list = new ArrayList<>();
        for (char[] c : panel) {
            list.add(String.copyValueOf(c));
        }
        return list;
    }
}

典型的回溯问题,利用回溯,每次判断当前这个位置可不可以放置,如果最后一排都放完了,就将答案传回去。