首页 > 编程语言 >力扣 LeetCode 51. N皇后(Day14:回溯算法)

力扣 LeetCode 51. N皇后(Day14:回溯算法)

时间:2024-12-05 11:33:49浏览次数:12  
标签:力扣 char return int 51 Day14 board backtracking row

解题思路:

每次进入backtracking都表示进入下一行

每个backtracking中处理当前行的各个列,看各列是否合法

isValid中

因为是一行一行向下遍历的,所以对应的当前行一定满足条件,没有放置过其他皇后,只需要看对应的列是否满足即可

是否符合需要看左上45°和右上45°,之所以是往上看,是因为只有上才有先前放置过的皇后

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

    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n];
        for (char[] c : board) {
            Arrays.fill(c, '.');
        }
        backtracking(board, n, 0);
        return res;
    }

    public void backtracking(char[][] board, int n, int row) {
        if (row == n) {
            res.add(formatConversion(board));
            return;
        }
        for (int i = 0; i < n; i++) { // i表示在当前row保持不变时的各个列
            if (isValid(board, n, row, i)) {
                board[row][i] = 'Q';
                backtracking(board, n, row + 1);
                board[row][i] = '.';
            }

        }
    }

    public List<String> formatConversion(char[][] board) {
        List<String> list = new ArrayList<>();
        for (char[] c : board) {
            String s = new String(c);
            list.add(s);
        }
        return list;
    }

    public boolean isValid(char[][] board, int n, int row, int col) {
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q')
                return false;
        }

        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 'Q')
                return false;
        }

        for (int i = row - 1, j = col + 1; i >= 0 && j <= n - 1; i--, j++) {
            if (board[i][j] == 'Q')
                return false;
        }
        return true;
    }
}

标签:力扣,char,return,int,51,Day14,board,backtracking,row
From: https://blog.csdn.net/qq_61504864/article/details/144260277

相关文章

  • 力扣103. 二叉树的锯齿形层次遍历
    链接:103.二叉树的锯齿形层序遍历-力扣(LeetCode)vector<vector<int>>vec;if(root==nullptr)returnvec;queue<TreeNode*>que;que.push(root);//true代表从左到右//false代表从右到左boolflag=true;while(!q......
  • 51c视觉~合集23
    我自己的原文哦~  https://blog.51cto.com/whaosoft/11859242#工业缺陷检测中数据标注需要注意的几个事项在工业场景中,网络结构决定了下限,数据决定着上限,要想模型有好的表现,数据是至关重要的。下面就这个项目来说一说,工业缺陷检测在标注数据时需要注意的几个事项:1、离得......
  • 代码随想录算法训练营第十六天(LeetCode513.找树左下角的值;LeetCode112.路径总和;LeetCo
    LeetCode513.找树左下角的值题目连接:找树左下角的值题目连接代码递归法/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.......
  • 【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换(12套样式,空1格-空8格,每套
    前期做数独惨宫格的所有排列,共有12套样式,空1格-空8格,每套510张,共6120小图)【教学类-43-24】20241127数独3宫格的所有可能(12套样式,空1格-空8格,每套510张,共6120小图)-CSDN博客文章浏览阅读1.7k次,点赞41次,收藏30次。【教学类-43-24】20241127数独3宫格的所有可能(12套样式,空1格-......
  • 27 基于51单片机的方向盘模拟系统
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,采用滑动变阻器连接数模转换器模拟重力加速度传感器电路;一个按键控制LED灯的点亮与熄灭;两路压力值与加速度值通过LCD1602......
  • 25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60,电压阈值为100,如果超于阈值,则蜂鸣器报警。二、硬件资源基于KEIL5编......
  • 25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60,电压阈值为100,如果超于阈值,则蜂鸣器报警。二、硬件资源基于KEIL5编......
  • 27 基于51单片机的方向盘模拟系统
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,采用滑动变阻器连接数模转换器模拟重力加速度传感器电路;一个按键控制LED灯的点亮与熄灭;两路压力值与加速度值通过LCD1602......
  • 28 基于51单片机的两路电压检测(ADC0808)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过ADC0808获取两路电压,通过LCD1602显示二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。编辑三、程序编程#include <REGX52.H>#include "int......
  • 27 基于51单片机的方向盘模拟系统
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,采用滑动变阻器连接数模转换器模拟重力加速度传感器电路;一个按键控制LED灯的点亮与熄灭;两路压力值与加速度值通过LCD1602......