【LeetCode】---- 面试题_08_12_八皇后

力扣链接:https://leetcode-cn.com/problems/eight-queens-lcci/

题目描述

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

示例:

 输入:4
 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
 解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

Code

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> res = new LinkedList<>();
        // 第0行开始存放皇后
        backTrack(new int[n], 0, n, res);
        return res;
    }

    private void backTrack(int[] board, int row, int n, List<List<String>> res) {
        // 触发结束条件
        if(row == n) {
            store(res, board);
            return;
        }

        for (int col = 0; col < n; col++) {
            // 排除不合法选择
            if(!isValid(board,row,col)){
                continue;
            }

            // 做出选择,第row行的col值存放的是可以摆放的皇后
            board[row] = col;

            // 进入下一行决策
            backTrack(board, row+1, n, res);

            // 撤销选择
            board[row] = 0;
        }
    }

    private boolean isValid(int[] board, int row, int col) {
        for (int i = 0; i < row; i++) {
            // 第i行已有皇后
            if(board[i] == col) {
                return false;
            }

            // 第i行皇后跟第row行第col列格子处在同一斜率上
            if(row - i == Math.abs(col - board[i]))
                return false;
        }
        return true;
    }

	// 设置格式,遍历棋盘,如果有皇后的格子,则拼接"Q",否则拼接"."
    private void store(List<List<String>> res, int[] board) {
        List<String> strings = new LinkedList<>();
        for (int row = 0; row < board.length; row++) {
            StringBuilder stringBuilder = new StringBuilder();
            for (int col = 0; col < board.length; col++) {
                if(board[row] == col) {
                    stringBuilder.append("Q");
                } else {
                    stringBuilder.append(".");
                }
            }
            strings.add(stringBuilder.toString());
        }
        res.add(strings);
    }
}

你可能感兴趣的:(LeetCode,回溯)