时间:2021-05-22
棋盘覆盖问题,是一种编程问题。
如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。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 npimport matplotlib.pyplot as pltclass 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)GitHub链接
到此这篇关于python实现棋盘覆盖问题及可视化的文章就介绍到这了,更多相关python棋盘覆盖问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言之前我们分享过用Python进行可视化的9种常见方式。其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplot
基于python代码的3D地图可视化,供大家参考,具体内容如下介绍使用Python对地图进行3D可视化。以地图为地图,可以在三维空间对轨迹、点进行可视化。库我们
本文实例为大家分享了python实现石头剪刀布的具体代码,供大家参考,具体内容如下老师布置了一个石头剪刀布的作业,要可视化,还是先用代码实现再说可视化的事。环境
1、pyecharts介绍Echarts是一款由百度公司开发的开源数据可视化JS库,pyecharts是一款使用python调用echarts生成数据可视化的类
基于Web的数据可视化概述。所谓基于Web的数据可视化技术,就是要在Web页面上实现动态数据图表,重点解决以下3个问题:一是获取动态的数据;二是传递数据信息;三