leetcode刷题记录(一百二十二)——46. 全排列

news/2025/2/26 6:56:08

(一)问题描述

51. N 皇后 - 力扣(LeetCode)51. N 皇后 - 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 示例 1:[https://assets.leetcode.com/uploads/2020/11/13/queens.jpg]输入:n = 4输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]解释:如上图所示,4 皇后问题存在两个不同的解法。示例 2:输入:n = 1输出:[["Q"]] 提示: * 1 <= n <= 9https://leetcode.cn/problems/n-queens/description/?envType=study-plan-v2&envId=top-100-liked

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

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

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

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

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

 (二)解决思路

        N皇后问题是回溯的经典问题。这一问题的特殊之处在于它是一个二维回溯问题,需要检索每一行中的各个元素是否符合条件,因此回溯问题当中的“标记”是当前应当搜索哪一行,即行索引row。终止条件是row==n,即搜索到了最后一行时收集所有结果。递归搜索时row改为row+1,即继续搜索下一行符合条件的元素。

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

    public List<List<String>> solveNQueens(int n) {
        char[][] queen = new char[n][n];
        for(int i=0;i<n;i++){
            Arrays.fill(queen[i],'.');
        }
        backtracking(queen,0,n);
        return result;
    }

    public void backtracking(char[][] queen, int row, int n){
        if(row == n){
            result.add(Array2List(queen,n));
            return;
        }
        for(int i=0;i<n;i++){
            if(check(queen,row,i,n)){
               queen[row][i]='Q';
               backtracking(queen,row+1,n);
               queen[row][i]='.'; 
            }
        }
    }

    //转换结果数据类型
    public List<String> Array2List(char[][] queen,int n){
        List<String> res = new ArrayList<>();
        for(char[] c : queen){
            res.add(String.copyValueOf(c));
        }
        return res;
    }

    //判断当前位置是否符合“与其他皇后不在同一直线”的要求
    public boolean check(char[][] queen, int row, int col,int n){
           //看同一列是否有皇后
           for(int i=0;i<row;i++){
                if(queen[i][col]=='Q'){
                    return false;
                }
           }

           //45度是否有皇后
           for(int i=row-1, j=col-1;i>=0&&j>=0;i--,j--){
                if(queen[i][j]=='Q'){
                    return false;
                }
           }

           //135度是否有皇后
           for(int i=row-1, j=col+1;i>=0&&j<=n-1;i--,j++){
                if(queen[i][j]=='Q'){
                    return false;
                }
           }

            return true;
    }

}

(三)小技巧

        这道题除了二维搜索以外,还有些小技巧。

  • 转换结果数据类型时,可以直接用String.copyValueOf()方法将二维数组的一整行直接转换成String类型;
  • 判断当前位置是否符合“与其他皇后不在同一直线”的要求时,只需要判断当前位置之前行的元素。并且由于回溯函数中for循环是按列搜索每一行,因此也不用判断是否有同一行的皇后。

http://www.niftyadmin.cn/n/5868260.html

相关文章

Ubuntu系统创建mariadb数据库(mysql),开通局域网络内连接

Ubuntu系统创建mariadb数据库&#xff08;mysql),开通局域网络内连接 1、安装数据库 如果你确定系统中没有安装 mariadb&#xff0c;可以使用以下命令进行安装&#xff1a; sudo apt update sudo apt install mariadb-server -y如果你只想安装客户端&#xff0c;可以使用以下…

C++ Primer 算法概述

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

MongoDB面试宝典【刷题系列】

文章目录 1、MySQL与MongoDB之间最基本的差别是什么?2、MongoDB成为最好NoSQL数据库的原因是什么?3、分析器在MongoDB中的作用是什么?4、如果用户移除对象的属性&#xff0c;该属性是否从存储层中删除?5、更新操作立刻fsync到磁盘?6、什么是master或primary?7、 数据在什…

利用go-migrate实现MySQL和ClickHouse的数据库迁移

1. 背景 在使用gorm时 , 尽管已经有了自动建表和钩子函数 . 但是在面临希望了解到数据库的变更 , 和插入一些系统字段时 , 以及最关键的数据库迁移的工作 . gorm显得稍微有点不便 . 在了解到migrate这项技术后 , 就使用go-migrate开发了一个可以迁移MySQL和ClickHouse数据库的…

Sqlserver安全篇之_隐藏实例功能和禁用SQL Server Browser服务

总结&#xff1a; 1、隐藏实例功能和禁用SQL Server Browser服务的功能一样&#xff0c;对应非默认实例(且这个默认实例是1433端口)的情况下&#xff0c;都是需要在连接字符串中提供端口号才能连接到实例 2、隐藏实例功能后&#xff0c;就算开启了SQL Server Browser服务&#…

JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能

提到飞行记录器&#xff0c;或许你的脑海中并未立刻浮现出清晰的画面&#xff0c;但一说起“黑匣子”&#xff0c;想必大多数人都能恍然大悟&#xff0c;知晓其重要性及用途。在航空领域&#xff0c;黑匣子作为不可或缺的设备&#xff0c;默默记录着飞行过程中的每一项关键数据…

1.1部署es:9200

安装es&#xff1a;root用户&#xff1a; 1.布署java环境 - 所有节点 wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 2.下载安装elasticsearch - 所有节点 wget ftp://10.3.148.254/Note/Elk/…

Java进阶学习笔记7——权限修饰符

什么是权限修饰符&#xff1f; 就是用来限制类中的成员&#xff08;成员变量、成员方法、构造器、代码块…&#xff09;能够被访问的范围。 protected使用的比较少&#xff0c;但是程序员还是要阅读代码&#xff0c;看官方文档是怎么写的&#xff0c;都会接触到protected修饰…