【回溯算法】【Python实现】n皇后问题

文章目录

    • @[toc]
      • 问题描述
      • 回溯算法
      • `Python`实现
      • 时间复杂性

问题描述

  • n × n n \times n n×n格的棋盘上放置彼此不受攻击的 n n n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子
  • n n n皇后问题等价于,在 n × n n \times n n×n格的棋盘上放置 n n n个皇后,任何 2 2 2个皇后不放在同一行或同一列或同一斜线上

回溯算法

  • n n n元组 x [ 1 : n ] x[1 : n] x[1:n]表示 n n n皇后问题的解, x [ i ] x[i] x[i]表示皇后 i i i放在棋盘的第 i i i行的第 x [ i ] x[i] x[i]
  • 如果将$n \times n $格的棋盘看做二维方阵,其行号从上到下,列号从左到右依次编号为 1 1 1 2 2 2 ⋯ \cdots n n n,从棋盘左上角到右下角的主对角线及其平行线上, 2 2 2个下标值的差值相等,斜率为 + 1 +1 +1的每条斜线上, 2 2 2个下标值的和值相等,若 2 2 2个皇后放置的位置分别是 ( i , j ) (i , j) (i,j) ( k , l ) (k , l) (k,l),且 i − j = k − l i - j = k - l ij=kl i + j = k + l i + j = k + l i+j=k+l,则说明这 2 2 2个皇后处于同一斜线上,由此可知,只要 ∣ i − k ∣ = ∣ j − l ∣ |i - k| = |j - l| ik=jl成立,就表明 2 2 2个皇后位于同一条斜线上
  • 用回溯法解 n n n皇后问题时,用完全 n n n叉树表示解空间
  • 可行性约束剪去不满足行、列和斜线约束的子树
  • i = n i = n i=n时,算法搜索至叶结点,得到一个新的 n n n皇后互不攻击放置方案,当前已找到的可行方案数 s u m sum sum 1 1 1
  • i < n i < n i<n时,当前扩展结点 Z Z Z是解空间中的内部结点,该结点有 n n n个儿子结点,对当前扩展结点 Z Z Z的每个儿子结点检查其可行性,并以深度优先的方式递归地对可行子树搜索,或剪去不可行子树

Python实现

def solve_n_queens(n):board = [['.'] * n for _ in range(n)]solutions = []def is_valid(row, col):# 检查当前位置是否可以放置皇后for i in range(row):if board[i][col] == 'Q':return Falseif col - (row - i) >= 0 and board[i][col - (row - i)] == 'Q':return Falseif col + (row - i) < n and board[i][col + (row - i)] == 'Q':return Falsereturn Truedef backtrack(row):if row == n:# 找到一个解决方案solutions.append([''.join(row) for row in board])returnfor col in range(n):if is_valid(row, col):board[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'backtrack(0)return solutionsn = 4solutions = solve_n_queens(n)print('-' * 5)for solution in solutions:print('\n'.join(solution))print('-' * 5)
-----
.Q..
...Q
Q...
..Q.
-----
..Q.
Q...
...Q
.Q..
-----

时间复杂性

  • n n n皇后问题的时间复杂性为 O ( n ! ) O(n!) O(n!)

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

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

相关文章

面试题库-项目

1.项目主要实现了哪些功能&#xff1f; 本项目是专门为校园食堂窗口定制的一款软件产品&#xff0c;包括系统管理后台和客户端两部分。其中系统管理后台主要提供给食堂内部员工使用&#xff0c;可以对餐厅的菜品、套餐、订单、员工等进行管理维护。客户端主要提供给学生及校职…

台球桌上的答案 如何优化图形化编程对复杂程序的展现

在公司的休息区&#xff0c;卧龙和凤雏正站在台球桌旁&#xff0c;一场激战即将打响。 “来吧&#xff0c;凤雏&#xff0c;让我们一决高下&#xff01;”卧龙手持台球杆&#xff0c;面带自信的微笑&#xff0c;向凤雏发起挑战。 凤雏点了点头&#xff0c;拿起台球杆&#xff0…

自定义表单工作流的优势介绍

当前&#xff0c;应用低代码技术平台可以助力企业提高效率&#xff0c;降低开发成本&#xff0c;实现个性化场景定制&#xff0c;因而越来越得到了客户的信赖与喜爱。很多客户朋友询问自定义表单工作流的优势和特点&#xff0c;为了帮助大家解决这个疑问&#xff0c;今天&#…

代码规范文档

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 2.1 关于花括号&#xff0c;分为K&R风格和allman风格 现在增加一个关于代码规范的链接&#xff1a; [华为方舟编译器开发文档…

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 文章目录 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯理论基础一、常规题目二、解题步骤…

极简——高并发下缓存穿透、雪崩、击穿定义和解决方案

缓存穿透 定义&#xff1a;查询一个一定不存在的数据&#xff0c;由于缓存不命中&#xff0c;将去查询数据库&#xff0c;但是数据库也没有这个数据&#xff0c;我们没有把查询的null写入缓存&#xff0c;这就将导致这个不存在的数据每次请求都去数据库查询&#xff0c;失去了…

PLC设备通过智能网关采用HTTP协议JSON文件对接MES等系统平台

智能网关IGT-DSER集成了多种PLC的原厂协议&#xff0c;方便实现各种PLC、智能仪表通过HTTP协议与MES等各种系统平台通讯对接。PLC内不用编写程序&#xff0c;设备不用停机&#xff0c;通过网关的参数配置软件(下载地址)配置JSON文件的字段与PLC寄存器地址等参数即可。 智能网关…

如何给文件和文件夹添加备注信息

1. 给文件添加备注信息 1. 打开文件夹&#xff0c;点击查看 → 选项 → 更改文件夹和搜索选项 → 勾除隐藏受保护的操作系统文件 → 勾选显示隐藏的文件、文件夹和驱动器&#xff1b; 2. listary工具搜索desktop.ini&#xff0c;随便点击一个desktop.ini文件&#xff0c;即可…

力扣:763. 划分字母区间

763. 划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度…

iOS 侧滑手势的打开关闭

方法一&#xff1a; 参考文章&#xff1a;点这里 方法二&#xff1a; - (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[self.navigationController.navigationBar setHidden:NO];//在其他离开改页面的方法同样加上下面两句代码self.isTapBac…

Gartner发布准备应对勒索软件攻击指南:勒索软件攻击的三个阶段及其防御生命周期

攻击者改变了策略&#xff0c;在某些情况下转向勒索软件。安全和风险管理领导者必须通过提高检测和预防能力来为勒索软件攻击做好准备&#xff0c;同时还要改进其事后应对策略。 主要发现 勒索软件&#xff08;无加密的数据盗窃攻击&#xff09;是攻击者越来越多地使用的策略。…

git的标签管理

理解标签 在Git中,标签tag用于标记特定的一个重要点&#xff0c;比如版本发布。标签允许捕捉某一次提交的状态&#xff0c;当我们需要退回到某次提叫的版本时&#xff0c;通过标签我们快速定位到。标签具有两种类型&#xff1a; 轻量标签&#xff1a;最简单的标签形式&#x…

Linux(CentOS7)离线使用安装盘部署Telnet

[在线工具网 - 各类免费AI工具合集&#xff0c;免费pdf转word等](https://www.orcc.online) https://orcc.online 挂载镜像CentOS-7-x86_64-DVD-1810.iso到/mnt下&#xff08;其他位置也行&#xff09;&#xff0c;命令如下&#xff1a; mount /dev/sr0 /mnt 安装包默认在Pa…

C++ 概览并发

并发 资源管理 资源 程序中符合先获取后释放&#xff08;显式或隐式&#xff09;规律的东西&#xff0c;比如内存、锁、套接字、线程句柄和文件句柄等。RAII&#xff1a; (Resource Acquisition Is Initialization),也称为“资源获取就是初始化”&#xff0c;是C语言的一种管…

[运维|系统] linux修改了/etc/fstab文件后,检查/etc/fstab文件是否正常

要求检查的原因 当修改了 /etc/fstab文件后&#xff0c;如果fstab中的内容出现错误&#xff0c;则会导致下次开机时&#xff0c;系统无法进入系统 检查命令 使用以下命令检查 fstab 文件内容是否正常 mount -a这个命令会尝试挂载 fstab 文件中列出的所有文件系统。如果 fst…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

hw蓝初中级面试题整理(流量特征+场景题)

Webshell检测&#xff1a; 0、d盾河马阿里伏魔查杀1、有具体时间的话可以根据时间和正则匹配关键字定位&#xff0c;然后封ip&#xff0c;追踪ip最后做了什么2、在网络层监控 HTTP&#xff0c;并且检测到有人访问了一个从没访问过的文件&#xff0c;而且返回了 200&#xff0c…

SpringBoot使用注解标注过滤器:跟踪请求日志、处理跨域问题

文章目录 引言I 跟踪请求日志(LogFilter)II 过滤器处理跨域问题III 拦截器和过滤器的原理3.1 Filter的执行顺序在Interceptor之前3.2 RequestInterceptor将MDC中request_id传入header引言 @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器 属性filterName声明…

[前后端基础]图片详解

[前后端基础]图片传输与异步-CSDN博客 https://juejin.cn/post/6844903782959022093#heading-3 base64、file和blob用JS进行互转的方法大全【前端】_js base64转blob-CSDN博客 后端存储方式 对于第一种存储方式&#xff0c;我们前端直接将存储路径赋值给 src 属性即可轻松显示。…

BufferGeometry--持续更新

.center&#xff08;&#xff09; 在Three.js中&#xff0c;BufferGeometry 对象的 .center() 方法是用于将几何体的原点&#xff08;0, 0, 0&#xff09;移到其包围盒的中心。这通常在你想要旋转、缩放或者对齐几何体时非常有用&#xff0c;因为它确保了这些操作是相对于几何…