问题介绍

棋盘覆盖问题,是一种编程问题。

如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。k>0时,可将2k×2k的棋盘划分为4个2(k-1)×2(k-1)的子棋盘。这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个l型骨牌覆盖这3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。

问题解释来源 百度

效果展示

k=1

k=2

代码实现

借助numpy处理数据,plot实现可视化。

使用面向对象的方法设计了棋盘类。

一步步将棋盘分为小区块,指导区块的边长为1,退出递归。

import numpy as np

import matplotlib.pyplot as plt

class board:

def __init__(self, size, x, y):

'''

初始化棋盘

:param size: 棋盘边长

:param x: 特殊点横坐标

:param y: 特殊点纵坐标

'''

self.special_block = (x, y)

self.board = np.zeros((size, size), dtype=int)

self.board[x][y] = (size * size - 1) / 3 + 1

self.t = 1

self.size = size

def visualize(self):

'''

可视化函数

:return: none

'''

plt.imshow(self.board, cmap=plt.cm.gray)

plt.colorbar()

plt.show()

def fill_block(self, x, y):

'''

填充点(x, y)

:param x: x

:param y: y

:return: none

'''

if self.board[x][y] == 0:

self.board[x][y] = self.t

else:

raise exception

def fill(self, s_x, s_y, size, c_x, c_y):

'''

递归函数填充棋盘或子棋盘(下文称区块)

:param s_x: 区块左上角x

:param s_y: 区块左上角y

:param size: 区块边长

:param c_x: 区块特殊点坐标x

:param c_y: 区块特殊点坐标x

:return: none

'''

if size == 1:

return

pos = (round((c_x - s_x + 1) / size), round((c_y - s_y + 1) / size))

center = (round(s_x + size / 2 - 1), round(s_y + size / 2 - 1))

ls = [(0, 0), (0, 1), (1, 0), (1, 1)] # 代表四个子区块

for i in ls:

if i != pos: # 如果不是原有特殊点所在区块,则构造特殊点并填充

x = center[0] + i[0]

y = center[1] + i[1]

self.fill_block(x, y)

self.t += 1 # 标记号加一,标记下一骨牌

for i in ls:

if i != pos: # 如果不是原有特殊点所在区块

# 所构造特殊点位置(x, y)

x = center[0] + i[0]

y = center[1] + i[1]

x1 = s_x + i[0] * (size / 2)

y1 = s_y + i[1] * (size / 2)

self.fill(x1, y1, size / 2, x, y)

else: # 如果是原有特殊点所在区块

x1 = s_x + i[0] * (size / 2)

y1 = s_y + i[1] * (size / 2)

self.fill(x1, y1, size / 2, c_x, c_y)

主函数

if __name__ == '__main__':

k = eval(input("请输入正整数k(棋盘大小2^2k,2^2k):\n"))

loc_x = eval(input("请输入特殊点横坐标:\n"))

loc_y = eval(input("请输入特殊点纵坐标:\n"))

size = 2 ** (2 * k)

b = board(size, loc_x, loc_y)

b.fill(0, 0, size, loc_x, loc_y)

b.visualize()

print(b.board)

总结

到此这篇关于python实现棋盘覆盖问题及可视化的文章就介绍到这了,更多相关python棋盘覆盖问题内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

python棋盘覆盖问题,python实现棋盘覆盖问题及可视化相关推荐

  1. python棋盘覆盖问题,python怎么实现棋盘覆盖问题及可视化

    python怎么实现棋盘覆盖问题及可视化 发布时间:2021-03-12 17:04:06 来源:亿速云 阅读:94 作者:TREX 这篇文章主要介绍"python怎么实现棋盘覆盖问题及可视 ...

  2. python棋盘覆盖_java实现的棋盘覆盖

    课课家和大家分享一些Java实现的棋盘覆盖的思路:应用分治法 分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题.k&g ...

  3. python txt文件读写(追加、覆盖)

    python txt文件读写(追加.覆盖) 读取文件每一行 # 读取文件每一行 with open(r"C:\Users\xiahuadong\Desktop\数字人代码\文件行数.txt& ...

  4. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  5. 花了1个月时间,把Python库全部整理出来了,覆盖所有,建议收藏

    目录 库名称简介 文件处理 图像处理 游戏和多媒体 大数据与科学计算 人工智能与机器学习 系统与命令行 数据库 在这里还是要推荐下我自己建的Python学习群:705933274,群里都是学Pytho ...

  6. 【Python 随练】输出国际象棋棋盘

    题目: 输出国际象棋棋盘 简介: 在本篇博客中,我们将使用 Python 代码输出国际象棋棋盘.国际象棋棋盘是一个8x8的方格矩阵,交替使用黑色和白色方格.我们将给出问题的解析,并提供一个完整的代码示 ...

  7. python小程序-【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  8. 视频教程-Python全栈视频教程-Python

    Python全栈视频教程 毕业于清华大学,曾担任Google算法工程师,微软人工智能领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Python ,Go语言,Sicikit ...

  9. python表白代码照片墙-python入会生成照片墙 利用python生成照片墙代码

    本篇文章小编给大家分享一下利用python生成照片墙代码,对大家的学习有一定的帮助,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. PIL(Python Image Libr ...

最新文章

  1. Attention机制_pytorch
  2. xhr请求python_python爬取boss直聘职位数据,并保存到本地
  3. 负起责任、审慎对待论文创新和性能指数,ACM Fellow罗杰波教授分享他的审稿经验...
  4. windows 7作为微软对抗Google的秘密武器
  5. java中gc是啥_java的gc是什么
  6. C-指针02 2017/11/24
  7. 筛选法求1到100以内的素数
  8. 嵌入式CANopen协议从入门到落地产品(更新2021.9.8)
  9. 北岛创投发起7200万美元加密VC基金,保罗·都铎·琼斯参与投资
  10. nvm、npm、nodejs的关系
  11. 你可以做一个更好的Coder为了自己的将来
  12. 企业移动办公小助手——华为云桌面
  13. 古剑奇谭如何修改服务器,寻木枝改方向了!《古剑奇谭网络版》这波更新太值得去体验了...
  14. 成功解决AttributeError: ‘Series‘ object has no attribute ‘split‘
  15. WIFI芯片调试APP Wif网络精灵
  16. 积分-钉钉考勤-加分
  17. git push时缺少Change-Id报错
  18. Apache ShenYu 集成 RocketMQ 实时采集海量日志的实践
  19. 手机兼容性测试--testin云测流程
  20. 无法运行rc.exe(已解决)

热门文章

  1. Java zip/gzip文件压缩和解压缩
  2. LINUX系统如何修改时间
  3. python中循环语句只有for和while两种_Python循环语句之while,for语句详解
  4. 仿百思不得姐App客户端
  5. [pycharm]添加环境变量
  6. keycode键盘 按键 - 键码 对应表
  7. 如何在WebStorm中设置边改边查模式
  8. html中的绝对定位怎么写,html – 表内的绝对定位
  9. Golang系列之布尔类型基本介绍
  10. ssm+jsp计算机毕业设计基于java的报刊杂志征订管理系统xdrwa(程序+lw+源码+远程部署).