当前位置: 首页 > news >正文

[Leetcode 51][Hard]-n皇后问题-回溯

目录

一、题目描述

二、整体思路

三、代码


一、题目描述

原题地址

二、整体思路

        这种可以算是组合问题的变种,在回溯函数中我们要保存当前已放置皇后的所有位置,同时递归调用时要进行寻找下一个皇后的放置位置。那么我们可以逐行遍历棋盘并作为递归调用的条件。然后在回溯函数内,遍历当前行的所有位置,同时判断此位置是否可以放置皇后。递归终止的条件时行数=棋盘行数,将此时的棋盘状态存入结果数组。

        难点在于如何判断当前位置是否可以放置皇后,可以从上方、主对角线、副对角线去看有没有已经放置皇后,若有则该位置不可以放置皇后,若无则可。左方不用看的原因是一行只会放一个皇后,每遍历到新的一行时该行一定是未放置皇后的。

三、代码

class Solution {List<List<String>> res=new ArrayList<>();public List<List<String>> solveNQueens(int n) {char[][] chess=new char[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){chess[i][j]='.';}}backtrace(chess,0,n);return res;}void backtrace(char[][] map,int row,int n){if(row==n){res.add(convert(map));return;}for(int i=0;i<n;i++){if(isvalid(map,row,i,n)){map[row][i]='Q';backtrace(map,row+1,n);map[row][i]='.';}}}List<String> convert(char[][] map){//char[][]→List<Stirng>List<String> templist=new ArrayList<>();for(int i=0;i<map.length;i++){StringBuilder tempstr=new StringBuilder();for(int j=0;j<map[i].length;j++){tempstr.append(map[i][j]);}String tempstr2=tempstr.toString();templist.add(tempstr2);}return templist;}boolean isvalid(char[][] map,int row,int col,int n){//upfor(int i=0;i<row;i++){if(map[i][col]=='Q'){return false;}}//leftfor(int i=0;i<col;i++){if(map[row][i]=='Q'){return false;}}//primary diagonal linefor(int i=row-1,j=col-1;i>=0 && j>=0;i--,j--){if(map[i][j]=='Q'){return false;}}//vice diagonal linefor(int i=row-1,j=col+1;i>=0 && j<n;i--,j++){if(map[i][j]=='Q'){return false;}}return true;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • BeanFactory 和 FactoryBean 的区别
  • 基于yolov10的PCB检测算法研究
  • Leetcode Day18 堆
  • EventBus搭配LifeCycle可能更美味
  • 大模型笔记01--基于ollama和open-webui快速部署chatgpt
  • 51单片机-定时器介绍
  • 模型 冯/诺依曼思维模型
  • 《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)
  • 【Java开发】Maven安装配置详细教程
  • python模块06 mock-1基础用法
  • JavaWeb:实验一JSP运行环境安装及配置
  • 5.Redis 集群 主从复制 哨兵
  • Mybatis 是如何进行分页的?分页插件的原理是什么?
  • java构建工具-maven的复习笔记【适用于复习或者初步了解】
  • WebView快速打开
  • Angular4 模板式表单用法以及验证
  • Apache Pulsar 2.1 重磅发布
  • JavaScript 奇技淫巧
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JSDuck 与 AngularJS 融合技巧
  • JS专题之继承
  • Lsb图片隐写
  • Mac转Windows的拯救指南
  • mockjs让前端开发独立于后端
  • Netty源码解析1-Buffer
  • nginx 配置多 域名 + 多 https
  • Object.assign方法不能实现深复制
  • Protobuf3语言指南
  • Python学习之路16-使用API
  • redis学习笔记(三):列表、集合、有序集合
  • scala基础语法(二)
  • SQLServer之创建数据库快照
  • vue-cli3搭建项目
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 浅谈web中前端模板引擎的使用
  • 使用Gradle第一次构建Java程序
  • 使用parted解决大于2T的磁盘分区
  • 树莓派 - 使用须知
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #include
  • #pragam once 和 #ifndef 预编译头
  • $.ajax()
  • (20050108)又读《平凡的世界》
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (接口封装)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十六)Flask之蓝图
  • (转)为C# Windows服务添加安装程序
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET C# 操作Neo4j图数据库
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料