求解八皇后问题

news2025/1/22 21:37:24

一、实验目的

利用回溯法搜索或爬山法找到八皇后问题的一个可行解。

二、实验内容

有一个 8 × 8 的棋盘,现在要将8个皇后放到棋盘上,满足:对于每一个皇后,在

自己所在的行、列、两个对角线都没有其他皇后。求所有满足的摆放方式。

                             

图2-1 八皇后问题示意图

三、实验方法

爬山法:

回溯法:

  1. Queen_set 函数接受一个参数 n,表示已经放置的皇后数量。
  2. queen_col_loc 列表用于存储皇后的列位置。
  3. 如果 n 等于 8,表示已经成功放置了八个皇后。在这种情况下,函数通过显示皇后的位置来打印解决方案。
  4. 调用 plot_chess 函数绘制当前的皇后摆放方案。
  5. 递增方案数 num 的值。
  6. 返回函数。
  7. 否则,循环遍历当前行的每个位置。
  8. 检查当前位置是否可以放置皇后,调用 check 函数进行检测。
  9. 如果可以放置皇后,将当前位置添加到 queen_list 列表中。
  10. 递归调用 Queen_set 函数放置下一个皇后。
  11. 回溯,尝试当前行的其他皇后摆放方法,从 queen_list 列表中移除最后一个元素。
  12. check 函数用于检测皇后的位置是否合法。
  13. 如果是第一行,直接返回 True。
  14. 否则,循环遍历之前的每一行。
  15. 检查当前位置是否与之前的皇后所在的列有冲突。
  16. 检查当前位置是否与之前的皇后所在的主对角线和副对角线有冲突。
  17. 如果有任何冲突,返回 False。
  18. 如果通过了所有检测,返回 True。
  19. plot_chess 函数用于绘制棋盘并保存求解结果。
  20. 创建一个大小为 8x8 的全零数组 map
  21. 遍历每一行,将皇后所在的列位置设为 1。
  22. 创建一个颜色映射 cmap,用于绘制棋盘。
  23. 使用 plt.imshow 函数绘制棋盘。
  24. 设置标题和刻度。
  25. 保存绘制的棋盘图像。
  26. 初始化 queen_list 列表为空。
  27. 初始化当前方案数 num 为 1。
  28. 调用 Queen_set 函数,从第一行开始放置皇后。

图3-1 回溯法解决八皇后问题运行结果

目录:

代码段一:导包

代码段二:函数定义

代码段三:调用运行

导包

import numpy as np

import matplotlib

import matplotlib.pyplot as plt

#设定中文字符集,解决绘图时中文乱码问题

matplotlib.rcParams['font.sans-serif'] = ['SimHei']

函数定义

#放置函数,参数为已放置的皇后数量

def Queen_set(n):

    global num

    global queen_list

    queen_col_loc=[i+1 for i in queen_list]

    #方案可行

    if n==8:

        print("第"+str(num)+"种:",(1,queen_col_loc[0]),(2,queen_col_loc[1]),(3,queen_col_loc[2]),(4,queen_col_loc[3])

        ,(5,queen_col_loc[4]),(6,queen_col_loc[5]),(7,queen_col_loc[6]),(8,queen_col_loc[7]))

        #绘制当前的皇后摆放方案

        plot_chess(queen_list)

        num+=1

        return

    else:

        #检查当前行哪一个位置可以放置

        for i in range(8):

            if check(n,i):

                queen_list.append(i)#在当前位置放置皇后

                Queen_set(n+1)#递归放置下一个皇后

                queen_list.pop()#回溯,尝试当前行的其他皇后摆放方法

#检测,传入参数为皇后摆放的位置

def check(row,col):

    if row==0:

        return True

    else:

        #检测列是否与之前摆放的皇后有冲突

        for i in range(row):

            if col==queen_list[i]:

                return False

            #检测对角线是否有冲突,分为主对角线和副对角线,满足直线方程x+y=n 和x-y=n

            elif i+queen_list[i]==row+col or i-queen_list[i]==row-col:

                return False

        return True

    

#绘制棋盘并保存求解结果

def plot_chess(result):

    global num

    map=np.zeros((8,8))

    for i in range(8):

        map[i,result[i]]=1

    cmap = matplotlib.colors.LinearSegmentedColormap.from_list('my_camp', ['white', 'black'], 2)

    plt.imshow(map, cmap=cmap)

    plt.title("第" + str(num) + "种解法", fontsize=16)

    plt.xticks([])

    plt.yticks([])

    plt.savefig('C:/Users/14767/Desktop/expriment/'+str(num)+'.png') #保存图片的路径,自行修改

调用运行

#从第一行开始逐行放置皇后,将皇后的列坐标放入列表中

queen_list=[]

#当前的方案数

num=1

Queen_set(0)

图3-2 八皇后问题解法可视化部分结果

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

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

相关文章

大模型技术实践(五)|支持千亿参数模型训练的分布式并行框架

在上一期的大模型技术实践中,我们介绍了增加式方法、选择式方法和重新参数化式方法三种主流的参数高效微调技术(PEFT)。微调模型可以让模型更适合于我们当前的下游任务,但当模型过大或数据集规模很大时,单个加速器&…

基于springboot实现酒店管理系统平台项目【项目源码+论文说明】

摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

Flow深入浅出系列之在ViewModels中使用Kotlin Flows

Flow深入浅出系列之在ViewModels中使用Kotlin FlowsFlow深入浅出系列之更聪明的分享 Kotlin FlowsFlow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略 Flow深入浅出系列之在ViewModels中使用Kotlin Flows Flow出现后,LiveData仍然可以用,并且…

基于springboot实现家具网站设计与实现平台项目【项目源码+论文说明】

摘要 随着移动互联网技术的深入发展,电子商务也不断的完善,线上销售额不断提高,网络消费成为人民日常生活的一部分。并且随着电子商务的发展,也呈现出多元化方向,各种农村电商、生鲜电商、家具电商等,带动…

AI 悄然变天:这家平台为何能俘获众多明星大模型「芳心」?

整个AI领域,GPT-4 发布无疑成为载入 AI 史册的大事件。但其还留下来一些发展空间,其不可能把所有的事情都做完。比如,涉及小数、分数的运算,GPT-4 可能给不出正确答案(其多位乘法运算准确率仅为 4.3%)。 可…

变电站监控无人值守:电力数字化、智能化趋势、技术与应用

随着电力行业的快速发展,变电站监控系统的升级和改造已成为行业的重要议题。其中,实现无人值守的监控模式成为现代变电站运行的关键。 一、变电站监控无人值守的趋势 随着科技的不断进步,电力行业正在逐步实现智能化、自动化的转型。变电…

centos 7.9 源码安装htop

1.下载源码 wget http://sourceforge.net/projects/htop/files/latest/download 2.上传到tmp目录,并解压 tar xvzf htop-1.0.2.tar.gz mv htop-1.0.2 /opt/ 进入到 cd /opt/htop-1.0.2/ 3.编译并安装 ./configure && make && make install 4.…

ESDA in PySal (6):评估空间异方差的局部模式:LOSH

ESDA in PySal (6):评估空间异方差的局部模式:LOSH 在下面的笔记本中,我们回顾了 Ord 和 Getis (2012) 提出的局部空间异方差 (LOSH) 统计量 ( H i H_i Hi​) -y)。 LOSH 旨在作为分析空间过程平均水平的本地统计数据的补充。 LO…

el-checkbox-group变成竖着的样式

加 style"display: block; padding-top: 10px; margin-left: 27px" <el-checkbox:indeterminate"isIndeterminate"v-model"checkAll"change"handleCheckAllChange">全选&#xff08;{{ memberList.length }}&#xff09;</el…

从Github中下载部分文件

我们经常回去Github中下载代码&#xff0c;但仓库中存在很多project代码。但我们如果只需要某一个或几个项目的代码&#xff0c;此时应该如何操作呢&#xff1f; 这里介绍两款工具&#xff0c;可以从仓库中下载部分文件的小工具: DownGit 和 GitZip 1. DownGit downGit 国内镜…

基于springboot实现大学生社团活动平台项目【项目源码+论文说明】

摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;网络管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信…

线程池执行流程

源码分析 execute&#xff08;提交&#xff09;方法源码&#xff1a; public void execute(Runnable command) {if (command null)throw new NullPointerException();int c ctl.get();if (workerCountOf(c) < corePoolSize) {if (addWorker(command, true))return;c ct…

python打开.npy文件的常见报错及解决

import numpy as npdata np.load("texture_data_256.npy") print(data) 解决办法&#xff1a; import numpy as npdata np.load("texture_data_256.npy",allow_pickleTrue) print(data) 再次运行后出现乱码&#xff01;&#xff01;&#xff01; 由于…

山西电力市场日前价格预测【2023-10-18】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-18&#xff09;山西电力市场全天平均日前电价为348.72元/MWh。其中&#xff0c;最高日前电价为505.50元/MWh&#xff0c;预计出现在18: 00。最低日前电价为288.10元/MWh&#xff0c;预计…

安科瑞能耗监测系统在新集卫生院综合楼、急诊楼的设计与应用

安科瑞 崔丽洁 摘要&#xff1a;针对医院建筑能耗高且能源管理不合理的问题&#xff0c;利用计算机网络技术、通讯技术、计量控制技术等信息化技术&#xff0c;实现能源资源分类分项计量和能源资源运行监管功能&#xff0c;清晰描述建筑内总的用能现状&#xff1b;实时监测各供…

什么是著作权?对此你了解多少?

在当今信息爆炸的时代&#xff0c;著作权成为一个备受关注的话题。创作是人类文明的重要组成部分&#xff0c;而著作权是创作者对自己作品的劳动和智慧的一种保护。很多人还不太了解著作权&#xff0c;那么希望看完此文&#xff0c;你会对它有一个新的认识。 一、著作权的概念 …

入职后快速配置mac方便快速上手业务for研测向

文章目录 下载基本工具配置 mac 基本修改 mac 密码apple id 登录mac 手势操作 配置开发环境homebrewgitjava/goland/pythonmavenrpcadbmysqlredis前端环境 软件配置配置软件通知chrome 配置配置 jetbrains 插件chrome 插件配置 iterm2配置邮箱视频软件配置软件登录 公司相关配置…

GPIO基本原理

名词解释 高低电平&#xff1a;GPIO引脚电平范围&#xff1a;0V~3.3V&#xff08;部分引脚可容忍5V&#xff09;数据0就是0V&#xff0c;代表低电平&#xff1b;数据1就是3.3V&#xff0c;代表高电平&#xff1b; STM32是32位的单片机&#xff0c;所以内部寄存器也都是32位的…

扫雷游戏源码解析:构建你自己的MineSweeper

大家好&#xff0c;我自己编写了一款扫雷游戏&#xff0c;并决定将其开源。在这个项目中&#xff0c;您可以体验初级、中级和高级难度的游戏模式&#xff0c;适合各种游戏水平。如果您热爱扫雷或对编程有兴趣&#xff0c;这个项目一定会吸引您。 项目亮点&#xff1a; 三种难度…

【数据结构】栈(C语言实现)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 栈 1.栈1.1栈的概念及结构…