python实现棋盘覆盖问题及可视化
作者:Patrick_cyk 发布时间:2021-04-17 02:10:29
标签: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)
GitHub链接
总结
来源:https://blog.csdn.net/m0_52571898/article/details/114678213


猜你喜欢
- 本文实例讲述了Python实现的简单hangman游戏。分享给大家供大家参考。具体如下:#!/usr/bin/env pythonimpor
- 本文实例讲述了python中pygame针对游戏窗口的显示方法。分享给大家供大家参考,具体如下:在这篇教程中,我将给出一个demo演示:当我
- 引子上下文管理器是一种简化代码的有力方式,其内部也蕴含了很多Python的编程思想,今天我们就来探究一下Python的上下文管理器。大家之前
- 本文实例讲述了Python3.4解释器用法。分享给大家供大家参考,具体如下:Linux/Unix的系统上,Python解释器通常被安装在 /
- 现在的需求是:下拉框中要是选择加盟商让其继续选择学校,要是选择平台管理员则不需要选择学校。隐藏选择下拉列表。选择枚举值:/// <su
- rstrip()方法返回所有字符都被去除的字符串(缺省为空格字符)结束字符串的副本。语法以下是rstrip()方法的语法:str
- SQL Server内存会不断增加当 SQL Server 数据库引擎在 Microsoft? Windows NT? 或 Windows?
- 1. 文件操作Python中的文件操作通常使用内置的open()函数来打开文件。以下是一个简单的示例:with open("fil
- 一、数据集小企鹅数据集,提取码:1234该数据集一共包含8个变量,其中7个特征变量,1个目标分类变量。共有150个样本,目标变量为 企鹅的类
- 由于车票难抢,有时需要的车票已经售空,而我们需要捡漏,便可使用这个脚本。具体实现了,自动查询某一车票的余票数量,当数量产生变化时,将自动发送
- 本文实例为大家分享了python实现石头剪刀布的具体代码,供大家参考,具体内容如下老师布置了一个石头剪刀布的作业,要可视化,还是先用代码实现
- 1、django搜索路径使用 import 语句时,Python 所查找的系统目录清单。查看方式:import sysprint
- crtrl.py监控Apache服务器进程的Python 脚本!/usr/bin/env Python import os, sys, ti
- 我就废话不多说了,大家还是直接看代码吧~# 用一行代码实现for循环初始化数组o = 10b = [ o + u for u in rang
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,
- 这篇文章所说的视觉元素是指:在一个网站中除去内容(文本、图片、视频、音频等)之外的一些元素。比如图标,背景色,以及背景图案。视觉元素的设计是
- 前言限流器,顾名思义用来对高并发的请求进行流量限制的组件。限流包括 Nginx 层面的限流以及业务代码逻辑上的限流。流量的限制在众多微服务和
- 发现问题python嵌套列表大家应该都不陌生,但最近遇到了一个问题,这是工作中遇到的一个坑,首先看一下问题raw_list = [[&quo
- 什么是循环呢?简单理解,循环就是反复的去做某一件事情。生活中的例子:比如我们听歌的时候,在歌曲的页面就会出现单曲循环、列表循环、随机播放以及
- 1.第一个实例:HelloWorld1.编写python代码from flask import Flaskapp=Flask(__name_