python棋盘覆盖问题,python实现棋盘覆盖问题及可视化
问题介绍
棋盘覆盖问题,是一种编程问题。
如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。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实现棋盘覆盖问题及可视化相关推荐
- python棋盘覆盖问题,python怎么实现棋盘覆盖问题及可视化
python怎么实现棋盘覆盖问题及可视化 发布时间:2021-03-12 17:04:06 来源:亿速云 阅读:94 作者:TREX 这篇文章主要介绍"python怎么实现棋盘覆盖问题及可视 ...
- python棋盘覆盖_java实现的棋盘覆盖
课课家和大家分享一些Java实现的棋盘覆盖的思路:应用分治法 分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题.k&g ...
- python txt文件读写(追加、覆盖)
python txt文件读写(追加.覆盖) 读取文件每一行 # 读取文件每一行 with open(r"C:\Users\xiahuadong\Desktop\数字人代码\文件行数.txt& ...
- 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc
分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...
- 花了1个月时间,把Python库全部整理出来了,覆盖所有,建议收藏
目录 库名称简介 文件处理 图像处理 游戏和多媒体 大数据与科学计算 人工智能与机器学习 系统与命令行 数据库 在这里还是要推荐下我自己建的Python学习群:705933274,群里都是学Pytho ...
- 【Python 随练】输出国际象棋棋盘
题目: 输出国际象棋棋盘 简介: 在本篇博客中,我们将使用 Python 代码输出国际象棋棋盘.国际象棋棋盘是一个8x8的方格矩阵,交替使用黑色和白色方格.我们将给出问题的解析,并提供一个完整的代码示 ...
- python小程序-【Python精华】100个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...
- 视频教程-Python全栈视频教程-Python
Python全栈视频教程 毕业于清华大学,曾担任Google算法工程师,微软人工智能领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Python ,Go语言,Sicikit ...
- python表白代码照片墙-python入会生成照片墙 利用python生成照片墙代码
本篇文章小编给大家分享一下利用python生成照片墙代码,对大家的学习有一定的帮助,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. PIL(Python Image Libr ...
最新文章
- QT 信号与槽 最简单例子
- C#获取SQLServer数据库表名和字段名
- 杭电 hdu 2040
- Field+offset(len)
- VMware安装CentOS过程(初学linux)
- 用于企业服务总线的类 USB 通用端口类型,第 1 部分: 当前 ESB 存在的问题
- java代码调用python导致系统重启_从Java调用Python代码时出现问题(不使用jython)...
- 远程访问centos系统
- 汉诺塔 java 递归_如何实现java汉诺塔递归算法
- 光纤通信原理实验箱QY-JXSY03
- http://www.boobooke.com/bbs/thread-10284-1-1.html
- 最新MQ与RabbitMQ面试题
- 期货及衍生品基础 - 概述总结
- skd怎么接入_网易七鱼怎么接入? 网易七鱼三种接入方式介绍
- 创可贴温度计,0排放温室气体:提前领略冬奥会的科技看点
- python 时间转为秒数
- chatgpt的150个指令大全
- 前端编程中利用PS切图还原设计图
- PHP类实例教程(四):PHP5类中的方法
- SRS开始支持SRT