解决 n 皇后难题

2023-11-30

我刚刚解决了python中的nqueen问题。该解决方案输出在 nXn 棋盘上放置 n 个皇后的解决方案总数,但尝试使用 n=15 需要一个多小时才能得到答案。任何人都可以看一下代码并给我一些加速这个程序的技巧......一个新手Python程序员。

#!/usr/bin/env python2.7

##############################################################################
# a script to solve the n queen problem in which n queens are to be placed on
# an nxn chess board in a way that none of the n queens is in check by any other
#queen using backtracking'''
##############################################################################
import sys
import time
import array

solution_count = 0

def queen(current_row, num_row, solution_list):
    if current_row == num_row:
        global solution_count 
        solution_count = solution_count + 1
    else:
        current_row += 1
        next_moves = gen_nextpos(current_row, solution_list, num_row + 1)
        if next_moves:
            for move in next_moves:
                '''make a move on first legal move of next moves'''
                solution_list[current_row] = move
                queen(current_row, num_row, solution_list)
                '''undo move made'''
                solution_list[current_row] = 0
        else:
            return None

def gen_nextpos(a_row, solution_list, arr_size):
    '''function that takes a chess row number, a list of partially completed 
    placements and the number of rows of the chessboard. It returns a list of
    columns in the row which are not under attack from any previously placed
    queen.
    '''
    cand_moves = []
    '''check for each column of a_row which is not in check from a previously
    placed queen'''
    for column in range(1, arr_size):
        under_attack =  False
        for row in range(1, a_row):
            '''
            solution_list holds the column index for each row of which a 
            queen has been placed  and using the fact that the slope of 
            diagonals to which a previously placed queen can get to is 1 and
            that the vertical positions to which a queen can get to have same 
            column index, a position is checked for any threating queen
            '''
            if (abs(a_row - row) == abs(column - solution_list[row]) 
                    or solution_list[row] == column):
                under_attack = True
                break
        if not under_attack:
            cand_moves.append(column)
    return cand_moves

def main():
    '''
    main is the application which sets up the program for running. It takes an 
    integer input,N, from the user representing the size of the chessboard and 
    passes as input,0, N representing the chess board size and a solution list to
    hold solutions as they are created.It outputs the number of ways N queens
    can be placed on a board of size NxN.
    '''
    #board_size =  [int(x) for x in sys.stdin.readline().split()]
    board_size = [15]
    board_size = board_size[0]
    solution_list = array.array('i', [0]* (board_size + 1))
    #solution_list =  [0]* (board_size + 1)
    queen(0, board_size, solution_list)
    print(solution_count)


if __name__ == '__main__':
    start_time = time.time()
    main()
    print(time.time() 

N-皇后问题的回溯算法是最坏情况下的阶乘算法。所以对于 N=8, 8!在最坏的情况下检查解决方案的数量,N=9 使其成为 9!等等。可以看出,可能的解决方案的数量增长得非常大,非常快。如果您不相信我,只需使用计算器并开始将连续数字相乘,从 1 开始。让我知道计算器内存不足的速度。

幸运的是,并非所有可能的解决方案都必须进行检查。不幸的是,正确解决方案的数量仍然遵循大致的阶乘增长模式。因此,算法的运行时间以阶乘速度增长。

由于您需要找到所有正确的解决方案,因此对于加快程序速度实际上无能为力。您已经很好地从搜索树中删除了不可能的分支。我不认为还有什么会产生重大影响。这只是一个缓慢的算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决 n 皇后难题 的相关文章

  • 仅当 ggplot 中 y 轴的下限设置为 0 时才会出现图条[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个条形图 当我将限制设置为 0 7 时 就会出现条形 但是 我希望下限为 1 而不是 0 当我将下限设置为 1 时 条形图不会出现 我收到以下错误消息 Removed 8 rows contain
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 在 python 中发送标头[重复]

    这个问题在这里已经有答案了 我有以下 python 脚本 我想发送 假 标头信息 以便我的应用程序就像 Firefox 一样运行 我怎么能这么做呢 import urllib urllib2 cookielib username passw
  • 如何很好地注释 ggplot2(手册)

    Using ggplot2我通常使用geom text和类似的东西position jitter注释我的情节 然而 对于一个漂亮的情节 我经常发现手动注释是值得的 像下面这样 data2 lt structure list type str
  • pandas 数据框的最大大小

    我正在尝试使用读取一个有点大的数据集pandas read csv or read stata功能 但我不断遇到Memory Errors 数据帧的最大大小是多少 我的理解是 只要数据适合内存 数据帧就应该没问题 这对我来说不应该是问题 还
  • magrittr 管道中的 WOE

    如何将下面的证据代码权重放入 magrittr 管道中 df gt 我尝试过的一切似乎都不起作用 df library Information library magrittr df a c aa bb cc aa aa aa bb cc
  • 对法语文本进行词形还原[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些法语文本需要以某种方式进行处理 为此 我需要 首先 将文本标记为单词 然后对这些单词进行词形还原以避免多次处理相同的词根 据我
  • cxfreeze virtualenv 中缺少 distutils 模块

    从 python3 2 项目运行 cxfreeze 二进制文件时 我收到以下运行时错误 project dist project distutils init py 13 UserWarning The virtualenv distuti
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • 使用 Python-VLC 的 PyInstaller:无属性“media_player_new”错误

    我使用 Python VLC 创建视频播放器 并使用 PyInstaller 在 Windows 10 计算机上生成可执行文件 最初 它给了我错误 Import Error Failed to load dynlib dll libvlc
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • “KMeans”对象没有属性“k”

    我使用 Yellowbrick 包绘制数据集的肘部曲线 以使用 KMeans 作为模型找到数据集的最佳簇数 我正在使用 Scikit learn KMeans 和 Yellowbrick kelbowvisualizer 函数 生成了肘部曲
  • 飞船推进AI:控制飞船在x=0、v=0时着陆的力

    我必须编写 AI 代码来控制游戏中宇宙飞船的许多推进喷气机 为简单起见 令空间为一维 宇宙飞船是一个点 只有 1 架喷气机 规则与问题 Let x v and a是飞船的位置 速度 加速度 Let F是施加在船上的喷射力 我知道质量m宇宙飞
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • 为什么我会在 Python 字符串格式中使用除 %r 之外的其他内容?

    我偶尔会使用 Python 字符串格式 这可以像这样完成 print int i Float f String s 54 34 434 some text 但是 这也可以这样做 print int r Float r String r 54
  • 如何将Python包从旧版本安装到新版本?

    我正在使用 python 3 7 最近在 Linux 中安装了 python 3 8 是否有任何 bash 命令或脚本可以获取 3 7 的所有软件包列表并在 3 8 版本中一一安装 我想避免每个包裹都手工完成 注意 我将它们安装在我的系统中
  • 将二进制数据视为文件对象?

    在此代码片段 由另一个人编写 中 self archive是一个大文件的路径并且raw file是以二进制数据形式读取的文件内容 with open self archive rb as f f seek offset raw file s
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 美丽的汤刮 - 登录凭据不起作用

    尝试使用登录凭据抓取页面 payload email gmail com password urls login url https www spotrac com signin url https www spotrac com nba

随机推荐

  • 桌面 SWING 应用程序上的 jpa

    我正在使用 SWING 开发一个单用户桌面应用程序 我对这种使用 java sql api 的应用程序有一点经验 并发现它一点也不舒服 在我的新应用程序中 我第一次尝试使用 JPA 我阅读了很多教程 这些教程使我几乎了解了我需要的所有内容
  • 无法启用spring框架的日志记录

    我想在Spring框架和Spring Security中配置日志记录 然后按照这个http docs spring io spring docs 3 2 x spring framework reference html overview
  • 自动布局以编程方式修改约束乘数

    如何以编程方式修改约束乘数 我设置了以下内容 self view addConstraint NSLayoutConstraint constraintWithItem button attribute NSLayoutAttributeW
  • 如何使用VC++更改桌面背景

    我目前正在尝试使用 SystemParametersInfo 更改桌面背景 当我输入我的内容时 vs 不会给我任何错误 但是当我运行程序时 我收到带有黄色三角形的警告 它说 KernelBase dll 抛出了某种异常 然后它说某些 PDB
  • 如何使用检测打印 Java 运行时调用的所有方法?

    我想打印出在运行时调用的所有方法 它们应该按照调用的顺序打印出来 如果多次调用它们 则应该打印多次 这可用于逆向工程 查看当您按下按钮或执行特定操作时调用哪些函数 我想为此使用 Java 代理和仪器 这可以使用 Java 代理和检测库来完成
  • 在 vbscript 中逐字节读取文件

    我正在寻找一种使用 VBScript 大 1 GB 读取大二进制文件的方法 我无法直接读取它ReadAll因为文件太大 所以我正在寻找一种在循环中读取它的方法 就像在 C 中一样 所以我想读取 X 个字节 处理它们 我不需要完整的文件来完成
  • MySQL单语句合并两个表

    我确信这个问题已经被问过 回答了 但我不知道这种操作是如何调用的 而且我的 SQL 知识是有限的 我正在寻找一个 SQL 语句来合并两个表 表用户 ID hash 1 abc 2 def 3 ghi 和 USER FIELD 表 ID us
  • 我可以阻止 iPhone OS 3.x 应用程序在 2.x 操作系统上运行吗?

    我不希望我的应用程序在运行 3 0 之前的任何操作系统的 iPhone 或 iPod 上运行 我的印象是应用程序商店会帮我处理这个问题 但我认为事实并非如此 提醒用户然后退出的最佳方法是什么 最好是 我希望在用户购买我的应用程序之前发生这种
  • 从 firebase 中的数组获取值[重复]

    这个问题在这里已经有答案了 我想从数组字段中获取值 但我收到一个错误 没有为类型 Object 定义运算符 文档 尝试定义运算符 from this codevar followSitesList value data followedSi
  • 部署在 apache 服务器上的 Dash 失败并显示“Dash 对象不可调用”

    我正在尝试将 python dash 应用程序部署到我的 apache 服务器 我遵循了我能找到的有关此配置的少量信息 官方文档 这个故障排除线程好一点 当我访问该网站时 页面返回一个500 Internal Server Error 被描
  • 将配置参数保存到存储库

    我刚刚开始使用 git ftp 它允许我将提交推送到 FTP 服务器 FTP 凭据以这种方式存储在 git config 中 git ftp user myusername url ftp myserver com httpdocs pas
  • 使用 MailGun 快速发送电子邮件

    Problem 我想使用MailGun从纯 Swift 应用程序发送电子邮件的服务 迄今为止的研究 据我了解 有两种发送电子邮件的方法通过邮件枪 一种是向 MailGun 发送电子邮件 MailGun 将重定向它 请参阅通过 SMTP 发送
  • Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

    假设我在 Mongodb 中进行这样的查询 db user find or field1 abc field2 def field3 ghi 并且返回了一些文件 了解三个过滤器中的哪一个 或多个 与返回的每个文档匹配的最简单方法是什么 通过
  • 如何点击整个vuejs组件

    我有组件 我想点击后运行方法
  • 对于没有空字符的字符串,如何计算 strlen?

    此代码返回 n 11 第 10 个和第 11 个字符为 和 这是如何运作的 strlen函数如何将其视为11个字符 在某些编译器中似乎将字符串长度视为 12 个字符 include
  • 将大量提交推送到 GitHub 会导致致命写入错误:文件描述符错误

    我使用 GitHub 来管理我的存储库 在尝试推送大型提交 1 5 GB 时遇到以下错误 error pack objects died of signal 9 fatal The remote end hung up unexpected
  • 从谷歌地图中的标记中删除默认的鼠标悬停工具提示

    我创建了一个用于显示标记信息窗口弹出窗口的应用程序 该应用程序工作正常 弹出窗口显示正确 但唯一的解决方案是 与鼠标悬停时的自定义信息窗口弹出窗口一起 带有 html 标签的默认弹出窗口是显示如下图所示 JSFiddle 谁能告诉我一些解决
  • angularjs:每个页面都有不同的元标记

    我已经使用 ruby on Rails 和 angularjs 使用 JS 和 Jquery 开发了网站 我只是想知道是否可以为 angularjs 中的每个页面使用不同的元标记 根据我的说法 任何爬虫都只会检测服务器端生成的元标记 因此
  • Azure Blob SAS 和 Cache-Control 确保资源得到缓存

    我们提供存储在 Azure Blob 容器上的私有资源 图像 文件等 安全性是使用以下方式实现的共享访问签名 为每个资源请求创建 例如 两个请求意味着两个不同的访问令牌 一般来说 安全 URL 由文件名和作为查询字符串传递的令牌组成 例如
  • 解决 n 皇后难题

    我刚刚解决了python中的nqueen问题 该解决方案输出在 nXn 棋盘上放置 n 个皇后的解决方案总数 但尝试使用 n 15 需要一个多小时才能得到答案 任何人都可以看一下代码并给我一些加速这个程序的技巧 一个新手Python程序员