【Leetcode】51 N皇后

news/2024/7/5 3:33:44

完成过程中的一些问题:

  • 一开始没有审题,只设置了两个数组判断行列上是否有元素,没有考虑斜线的问题。
  • 出现了行的重复,对行只需要递归,不需要循环。
  • 思路:按行摆放棋子,摆放棋子时检查列上和斜线上是否有棋子,如果有,进行剪枝

辅助函数:

1、leanLine:位置 ( r o w , c o l ) (row, col) (row,col)的45°和135°斜线是否有元素占据。

	public boolean leanLine(int row, int col) {
        // 检查45度往上
        int i = row - 1;
        int j = col + 1;
        while (i >= 0 && j < n){
            if (used[i][j]) {
                return false;
            }
            i--;
            j++;
        }
        // 45度往下
        i = row + 1;
        j = col - 1;
        while (i < n && j >= 0) {
            if (used[i][j]) {
                return false;
            }
            i++;
            j--;
        }
        // 检查135度往上
        i = row - 1;
        j = col - 1;
        while (i >= 0 && j >= 0) {
            if (used[i][j]) {
                return false;
            }
            i--;
            j--;
        }
        // 135度往下
        i = row + 1;
        j = col + 1;
        while (i < n && j < n){
            if (used[i][j]) {
                return false;
            }
            i++;
            j++;
        }
        return true;
    }

2、从boolean[][]的棋盘得到指定输出。

	public List<String> getOutput() {
        // 从used数组得到输出
        List<String> strs = new ArrayList<>();
        for (boolean[] row: used) {
            StringBuilder s = new StringBuilder();
            for (boolean b : row) {
                s.append(b ? "Q" : ".");
            }
            strs.add(s.toString());
        }
        return strs;
    }

主要函数:

DFS(i):第i行上方的棋子已经选择好,只需要考虑第i行以下部分。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

class Solution {

    boolean[] colsUsed;  // 快速判断行列有无元素
    boolean[][] used;  // 判断斜线有无元素,以及负责输出
    int count = 0;  // 已经布置的queen的个数
    int n;
    List<List<String>> res = new ArrayList<>();

    public boolean leanLine(int row, int col) { ... }

    public List<String> getOutput() { ... }

    public List<List<String>> solveNQueens(int n) {
        this.n = n;
        colsUsed = new boolean[n];
        used = new boolean[n][n];
        DFS(0);
        return res;
    }

    public void DFS(int i) {
        // 从第i行开始选择,上方的棋子已经选择好
        if (count == n) {
            res.add(getOutput());
            return;
        }

        for (int j = 0; j < n; j++) {
            // 同一列有棋子,剪枝
            if (colsUsed[j]) {
                continue;
            }
            // 斜线上有棋子,剪枝
            if (!leanLine(i, j)) {
                continue;
            }
            count++;
            colsUsed[j] = true;
            used[i][j] = true;
            DFS(i + 1);
            colsUsed[j] = false;
            used[i][j] = false;
            count--;
        }
    }
}

http://lihuaxi.xjx100.cn/news/1216006.html

相关文章

Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析…

2023年6月 国内大语言模型对比【国内模型正在崛起】

先说一下这个文章怎么来的。因为朋友问我大语言模型可以生成公务员面试回答不&#xff0c;我说可以啊。之前看文心有这个服务。我想最近好几个模型也没用了测一把&#xff01;结果&#xff01;大吃一惊&#xff01;我觉得我的三个傻孩子长大了&#xff01;&#xff08;chatglm1…

【28JavaScript 使用误区】避免常见陷阱:JavaScript 使用误区详解,助您写出高质量、可靠的代码

JavaScript 使用误区 在学习和使用 JavaScript 的过程中&#xff0c;很容易陷入一些常见的误区。这些误区可能导致代码出错、性能下降或安全漏洞。本文将帮助您识别并避免这些常见的 JavaScript 使用误区。 1. 不加分号的后果 在 JavaScript 中&#xff0c;每条语句的结尾应…

VSCode+GDB+Qemu调试ARM64 linux内核

俗话说&#xff0c;工欲善其事 必先利其器。linux kernel是一个非常复杂的系统&#xff0c;初学者会很难入门。 如果有一个方便的调试环境&#xff0c;学习效率至少能有5-10倍的提升。 为了学习linux内核&#xff0c;通常有这两个需要 可以摆脱硬件&#xff0c;方便的编译和…

JavaScript进阶(下)

# JavaScript 进阶 - 第3天笔记 > 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 - 了解面向对象编程的一般特征 - 掌握基于构造函数原型对象的逻辑封装 - 掌握基于原型对…

AI小帮手

AI小帮手 一、专门面向产品经理的 AI 小帮手 PMAI 是一款专门面向产品经理岗位的 AI 助手&#xff0c;可以帮助产品经理更轻松地完成工作。 比如可以一键生成 PRD、解决方案、流程图等&#xff0c; 还可以通过粘贴 PRD 的方式&#xff0c;生成测试用例&#xff0c;以完成功能…

chatgpt赋能python:Python如何访问文件

Python如何访问文件 Python是一种优秀的编程语言&#xff0c;被广泛应用于各种领域&#xff0c;包括文件处理。在Python中&#xff0c;我们可以使用内置的文件处理功能访问文件。 什么是文件&#xff1f; 文件是计算机系统中的一种数据存储形式。它们可以包含任何类型的信息…

shell脚本:函数

shell脚本-函数 一、函数&#xff1a;1.定义&#xff1a;2.作用&#xff1a;3.格式&#xff1a; 二、函数传参&#xff1a;1.定义&#xff1a;2.函数变量&#xff1a;3.递归&#xff1a;4.函数库&#xff1a; 一、函数&#xff1a; 1.定义&#xff1a; &#xff08;1&#xf…