leetcode 51. N 皇后 思考分析

目录

    • 题目
    • 思考
    • AC代码

题目

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

思考

首先以N=4为例,画出解空间树的一部分:
在这里插入图片描述

根据模板:

void backtracking(参数)
{if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中结点孩子的数量就是集合的大小)){处理结点;backtracking(路径,选择列表);		//递归回溯,撤销处理结果;}
}

1、确定回溯函数参数,返回值
当前所在的行(层),当前的棋盘布局。
N的大小

void backtracking(int hang,vector<string>& chessboard,int n)

全局变量:vector<vector>result;
result是个存放chessboard的变量。
这里的chessboard就相当于之前回溯题目中的path、子结果。
2、确定终止条件:
当遍历到N的最后一层(n-1)时,再往下一层,我们就需要返回了。

if(hang == n)
{result.push_back(chessboard);return ;
}

3、确定单层逻辑
如果本行的某列放入皇后,且不违反规则,即可进入下一行探索

 for(int lie = 0;lie < n ;lie++)
{if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q';	//放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';	//回溯撤销}}

4、判断是否满足分布条件有三个:

1、皇后不在同一行
2、皇后不在同一列
3、皇后不在同一斜线上

a、同时我们注意,我们探索的时候就是按照深度探索的,所以保证了每一行只有一次赋值Q。所以第一个条件不需要特别处理。
b、由于按照深度往下搜索,所以判断皇后在同一列的时候可以剪枝:

//检查本行之上的行的同一列是否存在Q
for(int i=0;i<hang;i++)
{if(chessboard[i][lie] == 'Q') return false;
}

c、由于按照深度往下探索,所以判断皇后在同一斜线的时候可以剪枝(注意,斜线分为向右上斜和左上斜两个方向)

//检查本行之上的行的右斜线上是否有皇后
for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--)
{if(chessboard[i][j] == 'Q') return false;
}
//检查本行之上的行的左斜线上是否有皇后
for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++)
{if(chessboard[i][j] == 'Q') return false;
}

AC代码

class Solution {
public:vector<vector<string>>result;bool juge_if_valid(int hang,int lie,vector<string>&chessboard,int n){//检查本行之上的行的同一列是否存在Qfor(int i=0;i<hang;i++){if(chessboard[i][lie] == 'Q') return false;}//检查本行之上的行的右斜线上是否有皇后for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--){if(chessboard[i][j] == 'Q') return false;}//检查本行之上的行的左斜线上是否有皇后for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++){if(chessboard[i][j] == 'Q') return false;}return true;} void backtracking(int hang,vector<string>& chessboard,int n){if(hang == n){result.push_back(chessboard);return ;}for(int lie = 0;lie < n ;lie++){if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q';	//放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.';	//回溯撤销}}return ;}vector<vector<string>> solveNQueens(int n) {result.clear();//填充初始棋盘vector<string> chessboard(n,string(n,'.'));backtracking(0,chessboard,n);return result;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No module named ‘tensorflow.examples‘解决方案

想从tensorflow中导入mnist手写数字数据集&#xff0c;结果报错 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

.NET通用基本权限系统

DEMO下载地址&#xff1a; http://download.csdn.net/detail/shecixiong/5372895 一、开发技术&#xff1a;B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解数独 思考分析

目录题目核心思路的不断细化1、核心框架2、考虑到每个位置的工作3、考虑到到达最后一列、该位置的数已经预置的情况4、判断是否符合规则的函数5、确定递归终止条件确定函数返回值AC代码题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 一个数独的解法需遵循如下规…

快速完成兼职外包开发任务

做了很多年的开发相关的工作&#xff0c;做过兼职开发&#xff0c;也做过外包一些开发项目。 兼职人员角色时 正是经历这些事情时&#xff0c;每次就要提前很费经的跟公司沟通&#xff0c;让他们把公司内部的svn开发出去&#xff0c;但是就是很难&#xff0c;会涉及到安全各方的…

使用YOLOv5训练NEU-DET数据集

一、下载YOLOv5源码和NEU-DET(钢材表面缺陷)数据集 YOLOv5源码 NEU-DET(钢材表面缺陷)数据集 这里的数据集已经经过处理了&#xff0c;下载即可 若通过其他途径下载的原始数据集标签为xml格式&#xff0c;需要转化为txt格式XML转txt格式脚本 二、数据集准备 NEU-DET(钢材表…

带分页功能的SSH整合,DAO层经典封装

任何一个封装讲究的是&#xff0c;使用&#xff0c;多状态。Action&#xff1a;任何一个Action继承分页有关参数类PageManage&#xff0c;自然考虑的到分页效果&#xff0c;我们必须定义下几个分页的参数。并根据这个参数进行查值。然后在继承ServiceManage&#xff0c;Service…

leetcode 198. 打家劫舍 思考分析

目录1、题目2、求解思路3、代码1、题目 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动…

找不到Windows照片查看器解决方法

桌面创建一个txt文本 复制这些命令&#xff0c;之后将后缀改为.reg&#xff0c;右击管理员身份运行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

伙伴分配器的一个极简实现

提起buddy system相信很多人不会陌生&#xff0c;它是一种经典的内存分配算法&#xff0c;大名鼎鼎的Linux底层的内存管理用的就是它。这里不探讨内核这么复杂实现&#xff0c;而仅仅是将该算法抽象提取出来&#xff0c;同时给出一份及其简洁的源码实现&#xff0c;以便定制扩展…

[USACO3.2.3 Spinning Wheels]

[关键字]&#xff1a;模拟 枚举 [题目大意]&#xff1a;有5个轮子&#xff0c;每个轮子优r个缺口并且会按一定速度不停转动&#xff0c;问什么时候可以使一条光线射过所有轮子。 // [分析]&#xff1a;从0到1000&#xff08;或其他的&#xff09;枚举分钟然后判断&#xff0c;当…

一、SQLServer2008安装(带密码)、创建数据库、C#窗体项目测试

一、下载和安装SQLServer2008 东西太大了&#xff0c;没法上传到资源里面&#xff0c;官网其他公众号都下载可以。 右击管理员身份 运行setup.exe 这个密钥不能用的话&#xff0c;也可以去百度其他密钥 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建议改一下路径&#xff0c;我这边修…

【C++grammar】多态、联编、虚函数

目录1、多态概念1.多态性有两种表现的方式2、联编&#xff08;实现多态&#xff09;1.静态联编2.动态联编3、实现运行时多态1.为何要使用运行时多态&#xff1f;2.如何实现运行时多态3.多态的例子1.调用哪个同名虚函数&#xff1f;2. 用途&#xff1a;可以用父类指针访问子类对…

一 MVC - HtmlHelper

HtmlHelper类位于System.Web.Mvc.Html之中主要有七个静态类组成&#xff1a; FormExtensions - BeginForm, BeginRouteForm, EndForm InputExtensions - CheckBox, CheckBoxFor, Hidden, HiddenFor, Password, PasswordFor, RadioButton, RadioButtonFor, TextBox, TextBoxFor …

二、用户登录和注册

一、页面设计 一共四个页面 主页面Form1&#xff0c;登录页面login&#xff0c;注册页面resister&#xff0c;主菜单页面main_page 系统运行进入Form1&#xff0c;单击登录按钮跳转到login&#xff0c;数据库中得存在数据信息且输入正确才可登录成功&#xff0c;跳转到main_pa…

【C++grammar】访问控制与抽象类与纯虚函数

目录一、访问控制 (可见性控制)1.private、public、protected关键字2.关键字示例1、关键字对类数据成员访问的限制3. 公有继承4. 私有继承5. 保护继承6. 私有继承和保护继承的区别二、抽象类与纯虚函数1.什么是抽象类2.抽象函数/纯虚函数3.抽象类示例一、访问控制 (可见性控制)…

三、上传织物图片至SQL Server并提供name进行展示织物照片

一、数据库的建立 还是在fiber_yy数据库下创建images表 images表设计如下 二、页面完善设计 main_page页面进行功能完善 入库管理系统 warehousing页面 库存查询系统 query页面 登录注册页面前面几个博文已经实现过了&#xff0c;这里就再赘述了&#xff0c;仍是沿用前…

ARM MMU工作原理剖析[转]

一、MMU的产生 许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当…

【原创】SharePoint Document library List Check out 文档时碰到的问题解决

环境&#xff1a;TFS(Team Foundation Server)集成的WSS 3.0&#xff08;SharePoint Service 3.0&#xff09; 问题&#xff1a;如题&#xff0c;祥见下图 解决&#xff1a;一般碰到没有经验的问题&#xff0c;大家当然是外事不决问谷歌了&#xff0c;于是谷歌搜到了这篇博客 h…

四、入库管理功能的完善

一、数据库的创建 在fiber_yy数据库下创建yy_textile表 先随便添加几条数据 二、页面的完善 登录注册页面我就不演示了&#xff0c;前几篇博文也都有介绍 warehousing入库页面 main_page页面进行功能完善 三、代码实现 warehousing页面 using System; using System.…

leetcode 232. 用栈实现队列 思考分析

题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返…