力扣面试题 08.12. 八皇后(java回溯解法)

Problem: 面试题 08.12. 八皇后

文章目录

题目描述

思路

八皇后问题 的性质可以利用回溯来解决,将大问题具体分解成如下待解决问题:

1.以棋盘的每一行为回溯的决策阶段,判断当前棋盘位置能否放置棋子

2.如何判断当前棋盘位置是否可以放置棋子

解题方法

1.回溯函数:

1.1定义二维结果集result,char类型二维数组(作为棋盘)并初始化

1.2当决策阶段row等于n 时,将当前的决策路径添加到result中(注意决策阶段应该等于n时才说明将棋盘判断完了,因为当决策阶段等于n时说明0 - n-1 已经判断处理完)

1.3由于在每一个决策阶段 我们需要对棋盘的每一列棋格判断(穷举),所以以每一列为循环判断(调用判断当前位置是否可以添加棋子 的函数),若可以则先将棋盘当前位置添上棋子,再回溯判断当前行的下一行,判断完当前行后还需恢复当前棋盘位置的状态
2.判断当前位置是否可以添加棋子函数
2.1依次利用循环判断当前位置的列,右上角,左上角是否存在棋子,存在则不可在当前位置添加棋子

复杂度

时间复杂度:

O ( n ! ) O(n!) O(n!)

空间复杂度:

O ( n ) O(n) O(n)

Code

java 复制代码
class Solution {
    //Two-dimensional result set
    private List<List<String>> result = new ArrayList<>();

    /**
     * Get the solution to the Eight Queens problem
     *
     * @param n The size of board
     * @return List<List < String>>
     */
    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                board[i][j] = '.';
            }
        }
        backtrack(0, board, n);
        return result;
    }

    /**
     * Find the solution of the eight queens problem by backtracking
     *
     * @param board Board
     * @param row   The row of board(The decision stage of backtracking)
     * @param n     The size of board
     */
    private void backtrack(int row, char[][] board, int n) {
        //End condition:A feasible solution is found
        if (row == n) {
            List<String> snapshot = new ArrayList<>();
            for (int i = 0; i < n; ++i) {
                snapshot.add(new String(board[i]));
            }
            result.add(snapshot);
            return;
        }
        //Each has n ways to place
        for (int col = 0; col < n; ++col) {
            if (isOk(board, n, row, col)) {//optional list
                //The chess board places pieces in row rows and col columns
                board[row][col] = 'Q';
                //Investigate the next row
                backtrack(row + 1, board, n);
                //Recover the selection
                board[row][col] = '.';
            }
        }
    }
    
    /**
     * Determines whether the current column can place chess pieces
     *
     * @param board The board
     * @param n     The row number and column number of board
     * @param row   The row number of board
     * @param col   The column number of board
     * @return boolean
     */
    private boolean isOk(char[][] board, int n, int row, int col) {
        //Check whether columns conflict
        for (int i = 0; i < n; ++i) {
            if (board[i][col] == 'Q') {
                return false;
            }
        }
        //Check whether top right corner conflict
        int i = row - 1;
        int j = col + 1;
        while (i >= 0 && j < n) {
            if (board[i][j] == 'Q') {
                return false;
            }
            i--;
            j++;
        }
        //Check whether top left corner conflict
        i = row - 1;
        j = col - 1;
        while (i >= 0 && j >= 0) {
            if (board[i][j] == 'Q') {
                return false;
            }
            i--;
            j--;
        }
        return true;
    }
}
相关推荐
weixin_4604435629 分钟前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w4 小时前
什么是AOP
java
Cc.Y4 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川4 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸4 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck4 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787054 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha4 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞4 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计