简单解决八皇后问题与n皇后问题

news2025/1/14 2:40:06

在这里插入图片描述

努力是为了不平庸~

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

目录

一、问题描述 

二、问题解决思路

1. 建立数据结构:

2. 约束条件的实现:

3. 结果展示:

4. 拓展至n皇后问题:

 三、代码展示

四、n皇后问题的思考

解决用户不能自由输入问题

解决方案显示和保存的优化


一、问题描述 

     八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。

    问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。

二、问题解决思路

1. 建立数据结构:

     我们可以使用一个一维数组来表示皇后的位置,数组的索引代表皇后所在的列,数组的值代表皇后所在的行。

     例如,对于八皇后问题,数组 [0, 4, 7, 5, 2, 6, 1, 3] 表示第一列的皇后在第0行,第二列的皇后在第4行,以此类推。

     在拓展至n皇后问题时,数组的长度即为n,每个值的范围为0到n-1,表示每一列的皇后所在的行。

2. 约束条件的实现:

     在回溯算法中,我们需要实现约束条件来确保每个皇后的位置是合法的,即它们不会相互攻击。

   同一行和同一列的约束条件很容易实现,只需检查数组中是否有相同的值即可。

   对于对角线的约束条件,我们可以通过判断两个皇后的行差与列差的绝对值是否相等来确定它们是否处于同一对角线上。

   在代码中,可以使用一个辅助函数来检查每个位置是否满足约束条件,如果满足,则继续递归处理下一列。

3. 结果展示:

    结果展示可以使用matplotlib库来绘制棋盘,其中皇后的位置可以用不同的颜色或符号表示。

可以创建一个函数,接收一个皇后位置的数组作为参数,然后使用matplotlib绘制一个方格棋盘,并在对应位置上绘制皇后。

4. 拓展至n皇后问题:

     要拓展至n皇后问题,我们需要对代码进行适当修改。主要的修改是将数组的长度从8修改为n,表示棋盘的大小为n×n。

     在约束条件的实现中,需要注意判断对角线的条件,即判断两个皇后的行差与列差的绝对值是否相等。

     在结果展示中,需要根据n的大小来动态调整棋盘的大小,并绘制对应的皇后位置。

 三、代码展示

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def is_safe(board, row, col):
    # 检查当前位置是否安全(不受其他皇后的攻击)
    for i in range(col):
        if board[i] == row or board[i] == row - (col - i) or board[i] == row + (col - i):
            return False
    return True

def solve_n_queens_util(board, col, solutions):
    if col == len(board):
        # 所有列都已经尝试过,找到一个解决方案
        # 将解决方案添加到DataFrame中
        solutions.loc[len(solutions)] = board
        return

    for row in range(len(board)):
        if is_safe(board, row, col):
            # 在当前位置放置皇后
            board[col] = row

            # 递归尝试下一列
            solve_n_queens_util(board, col + 1, solutions)

def solve_n_queens():
    board = [-1] * 8
    solutions = pd.DataFrame(columns=['Q{}'.format(i+1) for i in range(8)])
    solve_n_queens_util(board, 0, solutions)
    return solutions

def draw_board(board, solution_number):
    plt.figure()
    plt.xlim(0, 8)
    plt.ylim(0, 8)

    # 绘制棋盘格子
    for i in range(8):
        for j in range(8):
            if (i + j) % 2 == 0:
                plt.fill([j, j, j + 1, j + 1], [i, i + 1, i + 1, i], 'white')
            else:
                plt.fill([j, j, j + 1, j + 1], [i, i + 1, i + 1, i], 'gray')

    # 绘制皇后位置
    for col, row in enumerate(board):
        plt.text(row + 0.5, col + 0.5, 'Q', fontsize=20, ha='center', va='center', color='black')

    plt.axis('off')
    plt.savefig('solution_{}.png'.format(solution_number), bbox_inches='tight')
    plt.close()

if __name__ == '__main__':
    solutions = solve_n_queens()
    print('总共找到 {} 个解决方案'.format(len(solutions)))
    for i, solution in solutions.iterrows():
        print('解决方案 {}:'.format(i + 1))
        draw_board(np.array(solution), i + 1)

四、n皇后问题的思考

    n皇后的代码相对于之前的八皇后问题代码只是做了很少的处理。

  1. 解决用户不能自由输入问题

在八皇后问题中,n的值是固定的(n=8),直接在代码中进行指定。而在修改过后的代码中,使用了input函数,让用户可以通过键盘输入n的值,从而实现了根据用户需求解决不同规模的n皇后问题。

  1. 解决方案显示和保存的优化

在原先的代码中,所有找到的解决方案都会被显示和保存为图片文件。而在这个代码中,先输出找到的解决方案的数量,然后询问用户是否要保存解决方案的图片文件,根据用户的选择进行相应的操作。这样可以提供更灵活的选择,避免不必要的图片保存。

总体而言,这个代码在八皇后问题的求解上没有本质性的改变,主要是在用户交互和结果展示方面进行了改进,增加了代码的灵活性和可定制性。

下面展示部分修改的代码段:

def is_safe(board, row, col):
    # 检查当前位置是否安全(不受其他皇后的攻击)
    for i in range(col):
        if board[i] == row or board[i] == row - (col - i) or board[i] == row + (col - i):
            return False
    return True

def solve_n_queens_util(board, col, solutions):
    if col == len(board):
        # 所有列都已经尝试过,找到一个解决方案
        # 将解决方案添加到DataFrame中
        solutions.loc[len(solutions)] = board
        return

    for row in range(len(board)):
        if is_safe(board, row, col):
            # 在当前位置放置皇后
            board[col] = row

            # 递归尝试下一列
            solve_n_queens_util(board, col + 1, solutions)

def solve_n_queens(n):
    board = [-1] * n
    solutions = pd.DataFrame(columns=['Q{}'.format(i+1) for i in range(n)])
    solve_n_queens_util(board, 0, solutions)
    return solutions

n = int(input("请输入皇后的数量:"))
solutions = solve_n_queens(n)
print('总共找到 {} 个解决方案'.format(len(solutions)))
user_input = input("是否保存解决方案图片?(yes/no): ")
if user_input.lower() == "yes":
    for i, solution in solutions.iterrows():
        draw_board(np.array(solution), i + 1)
        print("解决方案 {} 已保存为图片".format(i + 1))
else:
    print("解决方案未保存为图片")

其他部分与八皇后问题一致。

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

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

相关文章

(STL之string)string类的用法详解

string类成员函数PART1 成员函数(构造函数拷贝构造函数):string 函数原型: string(); string (const string& str); string (const string& str, size_t pos, size_t len npos); string (const char* s); string (const char* s, size_t n)…

项目中使用es(一):使用springboot操作elasticsearch

使用springboot操作es 写在前面搭建项目环境和选择合适版本具体的代码实现(1)继承ProductInfoRepository具体的代码实现(2)使用ElasticsearchRestTemplate操作问题总结最后放个demo 写在前面 对于elasticsearch的搭建&#xff0c…

【Top10】天津高性价比Web前端培训机构(Web前端需要掌握什么技能)

Web前端开发已经成为了一门备受瞩目的技能,对于一些初学者或者转行的人来说,也是非常友好的,当然越火也越会存在争议,大部分没有经验的人会选择参加培训来学习Web前端技术,也有不少人对于参加Web前端培训的必要性存在疑…

项目管理系统的设计与实现(ASP.NET,SQL)

开发环境:Microsoft Visual Studio 数据库:Microsoft SQL Server 程序语言:asp.NET(C#)语言本系统的开发使各大公司所的项目管理更加方便快捷,同时也促使项目的管理变的更加系统化、有序化。系统界面较友好,易于操作。…

AIGC下的低代码赛道,你我皆是拓荒人

今年年初,ChatGPT的现象级爆发,让其底层技术AIGC的承载方OpenAI备受关注。几重buff叠加,打工人的命运可以说是跌宕起伏,命途多舛了。在国内,AIGC的长期价值已逐渐被挖掘,正在重构人们的办公、娱乐乃至生活方…

启真医学大模型

启真医学大模型 QiZhenGPT: An Open Source Chinese Medical Large Language Model 本项目利用启真医学知识库构建的中文医学指令数据集,并基于此在LLaMA-7B模型上进行指令精调,大幅提高了模型在中文医疗场景下效果,首先针对药品知识问答发…

事务隔离级别-浅析

事务隔离级别是指在并发操作下,不同的事务之间互相隔离的程度。常见的事务隔离级别有以下四种: 读未提交(Read Uncommitted):一个事务可以读取另一个未提交事务的数据。这样可能会导致脏读、不可重复读和幻读等问题。…

是德KEYSIGHT N9918A、N9917A 手持式射频和微波组合分析仪

是德(KEYSIGHT) N9917A,N9918A 手持式射频和微波组合分析仪 Keysight N9918A FieldFox 组合分析仪能够处理日常维护、深度故障排除以及介于两者之间的任何事情。Keysight N9918A (Agilent) FieldFox 可随时随地为您提供高质量测量。将 FieldFox N9918A 添加到您的故…

面试官:你来说一下分布式锁的设计与实现

今天跟大家探讨一下分布式锁的设计与实现。希望对大家有帮助,如果有不正确的地方,欢迎指出,一起学习,一起进步哈~ 分布式锁概述 数据库分布式锁 Redis分布式锁 Zookeeper分布式锁 三种分布式锁对比 1. 分布式锁概述 我们的…

低代码制造ERP管理系统:降低开发成本,提高生产效率

随着制造业的快速发展,ERP管理系统成为了现代制造业中不可或缺的一部分。ERP管理系统可以帮助企业更好地管理生产流程、库存和供应链等方面,从而提高企业的生产效率和竞争力。然而,传统的ERP管理系统往往需要大量的编程工作和长周期的开发过程…

Kali渗透Windows服务器

这个实验主要让我们学习漏洞扫描技术基本原理,了解其在网络攻防中的作用,掌握使用Kali中的Metasploit对目标主机渗透,并根据报告做出相应的防护措施。 本次实战环境:Kali渗透Windows服务器 实战步骤一 本实验通过利用kali进行漏…

【springcloud微服务】Spring Cloud Alibaba 整合dubbo与openfeign

一、前言 dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组…

LabVIEWCompactRIO 开发指南第六章43

LabVIEWCompactRIO 开发指南第六章43 复用 模块中较昂贵的组件之一是ADC。通过使用多路复用器(也称为多路复用器)通过单个ADC路由多个通道,多路复用模块以比同步模块更低的每通道价格提供更高的通道数。 在学习如何对这些模块进行编程之前…

前端学习Flutter笔记(第一章:安装软件,配置环境变量等)

学习背景 人都是有惰性的,如果没有外界压力,基本不会取主动学习,有那个学习的时间宁愿多刷点小视频。。。。 公司有项目使用Flutter写的,想让我接手,可是咱不会啊,没接触过。就浅浅的在b站着了几个视频。 第…

什么是腾讯云轻量应用服务器?轻量与云服务器对比区别有哪些?

什么是腾讯云轻量应用服务器?轻量应用服务器是腾讯云推出的开箱即用轻量级云服务器,适合个人开发者或中小企业使用,腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器成本更低?是因为轻量服务器CPU内存性能比…

Transformer-《Attention Is All You Need》

目录 0.Transformer介绍 1.self-attention 和Multi-heads self-attention 1.1 self-attention(自注意力机制) 1.2 Multi-heads self-attention(多头自注意力机制) 2.网络结构 2.1 encoder(编码器) 2…

【尔嵘】感恩四周年,感谢支持

前言 注意:为感谢各位铁粉支持,【尔嵘】将随机一个号码赠送一本vue.js书籍,欢迎评论区留言! 在当前互联网领域中,CSDN是一个非常知名的技术社区,在这里你可以接触到很多高质量的技术文章和技术交流。对于技…

九年测试老鸟,写给1~5年的测试工程师的几点建议,满满硬货指导

从15年毕业到现在也从业八年了,普通本科毕业,现在一家互联网公司担任测试部门总监,摸爬打滚,坑坑洼洼也经历了不少。思绪很久决定还是写下这篇,希望对后进的小伙子少走一点弯路。 很多人把职场想得太美好,其…

七人拼团系统开发模式详解

七人拼团是最近兴起的一个模式,它通过更人性化的奖励机制,将产品利润最大化让利给参与拼团的用户,达到促进用户主动积极裂变和团队平台引流提升销量的效果,下面就来详细说一下这个模式。 七人拼团最大的特点,就是结合了…

JVM之栈和堆运行时内存深度剖析

运行时内存篇 程序计数器 也是线程私有的,不共享,因为cpu时间片轮换的缘故,所以需要记录上次未执行完的线程执行到那条字节码指令了,所以每个线程需要记录当前执行的命令的内存指针,以方便线程再次得到执行的时候按照正确的顺序执行 JVM之栈(虚拟机栈) 基础知识 会gc吗 不…