摘要:本文内容是关于如何实现残缺棋盘覆盖仿真软件,算法课作业要求设计开发一个残缺棋盘覆盖仿真软件。使用”分治算法“求解问题,Python编程语言实现功能;使用PyQt5和Python热力图实现界面和仿真效果展示。
1 残缺棋盘覆盖仿真作业
1.1 题目要求
1.2 问题描述
2 实现效果
2.1 效果图
2.2 视频演示
残缺棋盘覆盖仿真演示视频
3 开发环境
语言:python3
开发工具:pycharm
工具库:
PyQt5 5.12.1
pyqt5-tools 5.11.2.1.3
注:导入上面两个库要先导入sip库
4 开发步骤
详细PyQT5开发配置步骤见博文 使用Python PyQt5实现一个简单的图像识别软件
5 算法
5.1 算法思想
采用分治思想 ,对的棋盘进行划分,划分为更小一级的棋盘实例。即划分为4个的棋盘:
划分后的4个小棋盘中只有一个棋盘存在残缺方格。首先覆盖残缺方格的小棋盘。然后把剩下3个小棋盘转变为残缺棋盘;此外,要注意位置问题,将一个三格板放置由这3个小棋盘形成的角上。
5.2算法核心代码
# 算法 分割棋盘
def splitchess(self, x, y, size, xl, yc):
# 判断size值
if size == 1:
return
# 分割
subSize = size // 2
# 设置类型标记 用于
if size > 24:
self.type = self.type % 4 + 1
else:
self.type += 1
# print(self.type)
n = self.type
# 假设特殊点在左上角区域 对左上角进行分割
if x < xl + subSize and y < yc + subSize:
self.splitchess(x, y, subSize, xl, yc)
else:
self.chess[xl + subSize - 1][yc + subSize - 1] = n
self.splitchess(xl + subSize - 1, yc + subSize - 1, subSize, xl, yc)
# 假设特殊点在右上角区域
if x < xl + subSize and y >= yc + subSize:
self.splitchess(x, y, subSize, xl, yc + subSize)
else:
self.chess[xl + subSize - 1][yc + subSize] = n
self.splitchess(xl + subSize - 1, yc + subSize, subSize, xl, yc + subSize)
# 假设特殊点在左下角区域
if x >= xl + subSize and y < yc + subSize:
self.splitchess(x, y, subSize, xl + subSize, yc)
else:
self.chess[xl + subSize][yc + subSize - 1] = n
self.splitchess(xl + subSize, yc + subSize - 1, subSize, xl + subSize, yc)
# 假设特殊点在右下角区域
if x >= xl + subSize and y >= yc + subSize:
self.splitchess(x, y, subSize, xl + subSize, yc + subSize)
else:
self.chess[xl + subSize][yc + subSize] = n
self.splitchess(xl + subSize, yc + subSize, subSize, xl + subSize, yc + subSize)
6.测试
7 说明
暂时仅仅实现最简单的覆盖问题,还要一些问题没完善;
1.随机生成残缺块没有去设置。我这里残缺块的位置是可以自己输入,作业要求随机生成。自己写一个随机生产坐标的函数就可完成;
2.以及k值大了,图片变模糊; 可以动态调整生成的图片大小或热力图其它解决方案;
3.其它等等;