首页 > 其他分享 >N皇后实验

N皇后实验

时间:2023-05-16 11:35:25浏览次数:38  
标签:self width 实验 board 皇后 btn painter size

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QGridLayout
from PyQt5.QtGui import QPainter, QColor, QFont


class QueenBoard(QWidget):
# 初始化,设置默认大小为400x400
def __init__(self, n, size=400):
super().__init__()
self.n = n
self.size = size
self.setWindowTitle('N-Queens Problem')
self.setGeometry(100, 100, self.size, self.size)
self.layout = QGridLayout()
self.setLayout(self.layout)
self.solution = []
self.count = 0
self.current_board = 0

self.solve()

# 解决N皇后问题
def solve(self):
def backtrack(board):
if len(board) == self.n:
self.count += 1
self.solution.append(board[:])
else:
for i in range(self.n):
if all(i != board[j] and abs(i - board[j]) != len(board) - j for j in range(len(board))):
board.append(i)
backtrack(board)
board.pop()

backtrack([])
self.paintEvent(None)

# 绘制当前N皇后问题的棋盘状态
def paintEvent(self, e):
painter = QPainter()
painter.begin(self)
self.draw_board(painter)
if self.solution:
self.draw_queens(painter)
self.draw_info(painter)
painter.end()

# 绘制棋盘的网格线
def draw_board(self, painter):
b_width = self.size / self.n
painter.setPen(QColor(0, 0, 0))
for i in range(self.n):
for j in range(self.n):
x = j * b_width
y = i * b_width
painter.drawRect(x, y, b_width, b_width)

# 绘制皇后的位置
def draw_queens(self, painter):
b_width = self.size / self.n
queens = self.solution[self.current_board]
painter.setBrush(QColor(0, 160, 230))
for i in range(self.n):
x = queens[i] * b_width
y = i * b_width
painter.drawEllipse(x + b_width/4, y + b_width/4, b_width/2, b_width/2)

# 绘制当前解的编号与总解数
def draw_info(self, painter):
font = QFont('Serif', 18, QFont.Light)
painter.setFont(font)
painter.drawText(self.width()/2 - 50, self.height() - 50, f'Solution {self.current_board+1}/{self.count}')

# 更新棋盘状态,切换到下一个布局
def next_board(self):
if self.solution and self.current_board < self.count-1:
self.current_board += 1
self.update()

# 更新棋盘状态,切换到上一个布局
def prev_board(self):
if self.solution and self.current_board > 0:
self.current_board -= 1
self.update()


if __name__ == '__main__':
app = QApplication(sys.argv)
board = QueenBoard(8)
board.show()

# 添加前一个和后一个布局的按钮
prev_btn = QPushButton('Prev', board)
prev_btn.setToolTip('Previous Board')
prev_btn.move(10, board.size - 40)
prev_btn.resize(80, 30)
prev_btn.clicked.connect(board.prev_board)

next_btn = QPushButton('Next', board)
next_btn.setToolTip('Next Board')
next_btn.move(board.size - 90, board.size - 40)
next_btn.resize(80, 30)
next_btn.clicked.connect(board.next_board)

sys.exit(app.exec_())

 

标签:self,width,实验,board,皇后,btn,painter,size
From: https://www.cnblogs.com/yunbianshangdadun/p/17404420.html

相关文章

  • 数据库实验
      1。数据库的备份和恢复是数据库管理中非常重要的任务之一,一旦数据库出现故障或数据丢失,备份和恢复操作将决定着数据库恢复的时间和效果。下面是关于数据库备份和恢复实验的设计思路:实验目的:了解数据库备份和恢复的概念、原理、方法,并能够熟练进行备份和恢复操作。实验......
  • N皇后感想及思路
    以下是一份N皇后系统说明报告的大致结构和内容:1.引言:介绍系统背景和目的,说明N皇后问题的定义和规则,并讨论N皇后问题的重要性和难点。2.系统架构:描述系统的总体框架和组成模块,包括输入模块、处理模块和输出模块等,简要说明各个模块的作用和接口。3.算法设计:介绍N皇后问题的解决算......
  • 第十二周实验——原型设计工具的学习与应用
    一、使用墨刀设计项目原型墨刀是一款在线原型设计与协同工具,借助墨刀,产品经理、设计师、开发、销售、运营及创业者等用户群体,能够搭建为产品原型,演示项目效果。墨刀同时也是协作平台,项目成员可以协作编辑、审阅,不管是产品想法展示,还是向客户收集产品反馈,向投资人进行Demo展示,或是......
  • 实验二 电子传输系统安全-进展1
    成员:王菁史婧怡徐艺铭马瑞婕邵子洁张敦敏日期:2023年5月15日 上周任务将上学期电子公文传输系统重新调试通过系统安全性设计系统架构分析学习学习使用gmssl、django等学习django安装使用下周安排学习文件的加密与传输流程小组讨论、构思系统框架完善系统安全性......
  • MSTP-VRRP-DHCP-OSPF-BFD实验(三)
    配置核心交换机SVI[HX_SW1]intvlanif2[HX_SW1-Vlanif2]ipadd192.168.2.25324[HX_SW1-Vlanif2]intvlanif3[HX_SW1-Vlanif3]ipadd192.168.3.25324[HX_SW1-Vlanif3]intvlanif4[HX_SW1-Vlanif4]ipadd192.168.4.25324[HX_SW1-Vlanif4]intvlanif5[HX_SW1-Vlanif5......
  • 实验四 电子琴模拟实验
    实验四电子琴模拟实验实验目的1、了解单片机系统发声原理2、进一步熟悉定时器编程方法实验说明1、利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。2、定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反......
  • 网络对抗实验七 网络欺诈防范
    一、实践内容(一)简单应用SET工具建立冒名网站1.使用命令vi/etc/apache2/ports.conf将Apache服务端口更改为80(HTTP)。2.使用命令apachectstart开启Apache服务3.使用命令setoolkit开启SET工具4.选择1(社会工程学攻击)->2(钓鱼网站攻击向量)->3(登陆密码截取)->2(网站克隆)5.输入i......
  • 算法基础上机实验——2023.5.15
    1.#include<cmath>#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;intmain(){inta[310],n,k=0;cin>>n;while(n!=-99999){a[k++]=n;cin>>......
  • 软件构造实验三
    本次实验的要求是实现轨道系统CircularOrbit,并实现三个具体应用。面向复用的设计CircularOrbit<L,E>对于每个轨道系统CircularOrbit<L,E>,L为其中心物体类型,E为其轨道物体类型。Set<Track>tracks为其轨道集合,Map<E,Track>object_trackMap表示其物体在轨道系统上的分布,Lcenter......
  • 火山引擎DataTester:A/B实验平台数据集成技术分享
    DataTester的数据集成系统,可大幅降低企业接入A/B实验平台门槛。 当企业想要接入一套A/B实验平台的时候,常常会遇到这样的问题:企业已经有一套埋点系统了,增加A/B实验平台的话需要重复做一遍埋点,费时费力;企业有多个客户端和数据中台并行的情况,这些不同来源的数据难以整合......