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

发布时间:2021-03-12 17:04:06

来源:亿速云

阅读:94

作者:TREX

这篇文章主要介绍“python怎么实现棋盘覆盖问题及可视化”,在日常操作中,相信很多人在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)

GitHub链接

总结

到此,关于“python怎么实现棋盘覆盖问题及可视化”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

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

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

    问题介绍 棋盘覆盖问题,是一种编程问题. 如何应用分治法求解棋盘覆盖问题呢?分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆 ...

  2. Python利用cv2创建10*10象棋棋盘图片

    Python利用cv2创建10*10象棋棋盘,棋盘大小为500*500 import cv2 import numpy img = numpy.zeros((500, 500), dtype=nump ...

  3. python调用求解器SCIP求解设施选址覆盖问题

    文章目录 1. 设施选址集合覆盖问题 2. 算法实现 2.1 测试数据集 OR-Library 2.2 python调用SCIP求解设施选址覆盖问题完整代码: 2.3 数据结果 参考文献 1. 设施选 ...

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

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

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

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

  6. python sleep什么意思,Python sleep()

    sleep() 函数在给定的秒数内暂停(等待)当前线程的执行. Python有一个名为时间的模块,该模块提供了一些有用的功能来处理与时间有关的任务.其中最受欢迎的功能之一是sleep() . slee ...

  7. 基于python的数据分析系统,python数据分析经典案例

    大家好,本文将围绕利用python进行数据分析案例展开说明,基于python的数据分析系统是一个很多人都想弄明白的事情,想搞清楚基于python的数据分析题目需要先了解以下几个事情. 1.如何利用py ...

  8. 【Python学习教程】Python异常处理机制

    文章目录 什么是异常处理,Python常见异常类型(入门必读) Python语法错误 Python运行时错误 Python异常处理机制到底有什么用? Python try except异常处理详解(入 ...

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

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

最新文章

  1. Android 8 WiFi断流,安卓8.0曝出重大bug,比国产手机WiFi断流严重多了
  2. 第十五章 深入分析iBatis框架之系统架构与映射原理(待续)
  3. 大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍
  4. 手机上网流量统计_数据统计 | 上半年手机流量同比增110.2%,你贡献了多少?
  5. 李楠:《流浪地球》抄的经典套路 但这不是贬低
  6. 开源软件漏洞安全风险分析
  7. dvi线支持多少分辨率_为什么用DVI接口分辨率不能达到1080
  8. Linux环境下命令行下载DM8
  9. (转载)基于STM32的多节锂电池管理系统的设计
  10. 农历与公历日期转换(1900年 至 2049年)
  11. 电脑重装系统之后MySQl如何恢复
  12. 球的表面积公式是怎么推导出来的?
  13. java tld tag_jsp中引用的tag和tld文件
  14. Win10开机(更新)后无法进入系统,黑屏一直转圈
  15. 基于计算机视觉的无人驾驶感知系统
  16. 一个新开端,存储服务器再添骨灰级玩家
  17. 零基础编程教学实录-001 二进制与计算机
  18. 快速排序和归并排序中一趟的理解(递归和非递归)
  19. java JDBC连接mysql
  20. python爬淘宝app数据_一篇文章教会你用Python爬取淘宝评论数据(写在记事本)

热门文章

  1. 那些被人误解的IT专业,网络安全:谢邀,不是黑客
  2. 环形缓冲区实现(C语言)
  3. Ubuntu 终端切换root 操作
  4. ubuntu18.04切换用户
  5. 3D建模听说很累是真的么,就业前景到底怎么样?
  6. 简单对接抖音小店的接口
  7. 沟通法则:我的思维我做主!
  8. linux实用技巧:获取当前系统显示分辨率xrandr --current
  9. numberpicker如何修改显示的条目数_30块钱就能修改里程数,新手如何才能买到靠谱的二手车?...
  10. vue3 Ant Design Vue DatePicker 默认当前年