【分治算法】【Python实现】棋盘覆盖

news2024/11/24 9:23:46

文章目录

    • @[toc]
      • 问题描述
      • 分治算法
      • 时间复杂性
      • `Python`实现

因上努力

个人主页:丷从心·

系列专栏:分治算法

学习指南:Python学习指南

果上随缘


问题描述

  • 在一个 2 k × 2 k 2^{k} \times 2^{k} 2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘
  • 4 4 4种不同形态的 L L L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何 2 2 2 L L L型骨牌不得重复覆盖

分治算法

  • k > 0 k > 0 k>0时,将 2 k × 2 k 2^{k} \times 2^{k} 2k×2k棋盘分割为 4 4 4 2 k − 1 × 2 k − 1 2^{k - 1} \times 2^{k - 1} 2k1×2k1子棋盘,特殊方格必位于 4 4 4个较小子棋盘之一中,其余 3 3 3个子棋盘中无特殊方格
  • 为了将这 3 3 3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个 L L L型骨牌覆盖这 3 3 3个较小棋盘的会合处

时间复杂性

T ( k ) = { O ( 1 ) k = 0 4 T ( k − 1 ) + O ( 1 ) k > 0 T(k) = \begin{cases} O(1) & k = 0 \\ 4 T(k - 1) + O(1) & k > 0 \end{cases} T(k)={O(1)4T(k1)+O(1)k=0k>0

T ( k ) = O ( 4 k ) T(k) = O(4^{k}) T(k)=O(4k)

  • 由于覆盖一个 2 k × 2 k 2^{k} \times 2^{k} 2k×2k棋盘所需的 L L L型骨牌个数为 ( 4 k − 1 ) / 3 (4^{k} - 1) / 3 (4k1)/3,故算法是一个在渐进意义下最优的算法

Python实现

def chessboard_cover(board, tr, tc, dr, dc, size):
    """
    :param board: 棋盘
    :param tr: 棋盘左上角行号
    :param tc: 棋盘左上角列号
    :param dr: 特殊方格行号
    :param dc: 特殊方格列号
    :param size: 棋盘大小
    """
    global tile_count

    # 基本情况: 棋盘大小为 1, 直接放置骨牌
    if size == 1:
        return

    t = tile_count
    tile_count += 1

    # 将棋盘分成 4 个子棋盘
    s = size // 2

    # 左上子棋盘
    if dr < tr + s and dc < tc + s:
        chessboard_cover(board, tr, tc, dr, dc, s)
    else:
        board[tr + s - 1][tc + s - 1] = t
        chessboard_cover(board, tr, tc, tr + s - 1, tc + s - 1, s)

    # 右上子棋盘
    if dr < tr + s and dc >= tc + s:
        chessboard_cover(board, tr, tc + s, dr, dc, s)
    else:
        board[tr + s - 1][tc + s] = t
        chessboard_cover(board, tr, tc + s, tr + s - 1, tc + s, s)

    # 左下子棋盘
    if dr >= tr + s and dc < tc + s:
        chessboard_cover(board, tr + s, tc, dr, dc, s)
    else:
        board[tr + s][tc + s - 1] = t
        chessboard_cover(board, tr + s, tc, tr + s, tc + s - 1, s)

    # 右下子棋盘
    if dr >= tr + s and dc >= tc + s:
        chessboard_cover(board, tr + s, tc + s, dr, dc, s)
    else:
        board[tr + s][tc + s] = t
        chessboard_cover(board, tr + s, tc + s, tr + s, tc + s, s)


size = 8
board = [[0] * size for _ in range(size)]

special_row = 3
special_col = 4

board[special_row][special_col] = -1

tile_count = 0

chessboard_cover(board, 0, 0, special_row, special_col, size)

for row in board:
    print(row)
[2, 2, 3, 3, 7, 7, 8, 8]
[2, 1, 1, 3, 7, 6, 6, 8]
[4, 1, 5, 5, 9, 9, 6, 10]
[4, 4, 5, 0, -1, 9, 10, 10]
[12, 12, 13, 0, 0, 17, 18, 18]
[12, 11, 13, 13, 17, 17, 16, 18]
[14, 11, 11, 15, 19, 16, 16, 20]
[14, 14, 15, 15, 19, 19, 20, 20]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3插槽的name和v-slot的研究

slot可以分为具名插槽和默认,默认插槽name是default 在父组件的template需要些v-slot/#,没写不生效,而在父组件下,而没被template包含的默认放在template且含有#default. 1)没写slot,可以不写template,也可写default的template2)写了name的slot,即使是default也必须些template…

STM32(垃圾桶开关盖)

封装超声波的代码 一、配置引脚的连接 二、配置 三、写代码 四、配置定时器 查找合适的定时器 其实这里的是remap&#xff08;复用&#xff09;&#xff0c;不重要 重要的是看Default才对 仔细查看之后发现还是能用的 先把开关灯封装好 再封装舵机 ----------------------…

谷粒商城实战(019 RabbitMQ-发送消息)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第248p-第p261的内容 介绍 MQ的三大特点&#xff1a;流量削峰、应用解耦、异步处理 redis是数据缓存&#xff0c;mq是任务缓存 AMQP的MODEL 第一…

静电纺丝左旋聚乳酸平行纳米纤维膜

静电纺丝左旋聚乳酸平行纳米纤维膜是一种特殊的纳米材料&#xff0c;它结合了静电纺丝技术的优点和左旋聚乳酸&#xff08;PLLA&#xff09;材料的特性。 静电纺丝技术是一种特殊的纤维制造工艺&#xff0c;在此过程中&#xff0c;高分子溶液或熔体在强电场中进行喷射纺丝。当电…

主成分分析(PCA):揭秘数据的隐藏结构

在数据分析的世界里&#xff0c;我们经常面临着处理高维数据的挑战。随着维度的增加&#xff0c;数据处理、可视化以及解释的难度也随之增加&#xff0c;这就是所谓的“维度的诅咒”。主成分分析&#xff08;PCA&#xff09;是一种强大的统计工具&#xff0c;用于减少数据的维度…

[华为OD]给定一个 N*M 矩阵,请先找出 M 个该矩阵中每列元素的最大值 100

题目&#xff1a; 给定一个 N*M 矩阵&#xff0c;请先找出 M 个该矩阵中每列元素的最大值&#xff0c;然后输出这 M 个值中的 最小值 补充说明&#xff1a; N 和 M 的取值范围均为&#xff1a;[0, 100] 示例 1 输入&#xff1a; [[1,2],[3,4]] 输出&#xff1a; 3 说…

数据仓库实验二:关联规则挖掘实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、创建数据库和表2、挖掘关联规则&#xff08;1&#xff09;新建一个 Analysis Services 项目 Sales&#xff08;2&#xff09;建立数据源视图&#xff08;3&#xff09;建立挖掘结构 Sales.dmm&#xff08;4&#xff09;部署…

FebHost:什么是挪威.no域名,如何注册?

挪威国家域名介绍 挪威是一个位于北欧的国家&#xff0c;北面和西面是大西洋和北海&#xff0c;东面和南面则与瑞典、芬兰接壤。挪威是一个高度发达的经济体&#xff0c;其政府在经济管理和可持续发展方面也取得了很多成就。挪威的人均GDP在世界范围内排名非常靠前&#xff0c…

C# Web控件与数据感应之 ListControl 类

目录 关于数据感应 ListControl 类类型控件 范例运行环境 数据感应通用方法 设计 实现 调用示例 数据源 调用 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;诸如 System.Web.UI.WebControls 里…

Anddroid系统APK卸载流程源码分析

这一章我们介绍APK的卸载过程&#xff0c;大致了解这里的卸载的过程如下&#xff1a; 1.从PMS的内部结构上删除acitivity、service、provider等信息 2.删除code、library和resource等信息 3.调用installd删除/data/data/packageName以及/data/dalvik-cache下面的文件 4.更新Set…

python学习笔记----函数(五)

一、函数介绍 在 Python 中&#xff0c;函数是一个组织好的、可重用的代码块&#xff0c;用来执行一个单一的、相关的动作。函数提供了代码的模块化和代码复用的能力。它可以接受输入参数&#xff0c;并可以返回一个结果。函数在 Python 编程中是基本的构建块之一。 二、函数…

前端入门:HTML(CSS边距,塌陷)

1.CSS边距 auto:浏览器自动计算的边距 length&#xff1a;以px,pt,cm等为单位指定边距&#xff0c;pt代表的是磅&#xff0c;1磅0.376毫米。 %&#xff1a;以父元素宽度的百分比来指定边距。 其中&#xff0c;length和%都可以取负值&#xff0c;表示减少外边距的空间大小。 …

面向对象练习题【从零开始学Java】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

Docker有哪些常见命令?什么是Docker数据卷?

喜欢就点击上方关注我们吧&#xff01; 哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。上一篇我们介绍了Docker的安装以及腾讯云镜像加速源的配置。本篇将带你学习Docker的常见命令、数据卷及自定义镜像等相关知识。 1、什么是镜像与容器&#xff1f; 利用Docker安装应…

RS0104YQ功能和参数介绍以及规格详情

RS0104YQ功能和参数介绍以及规格详情-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0104YQ 是一款由润石科技&#xff08;Runic Semiconductor&#xff09;生产的肖特基整流器。肖特基整流器是一种半导体器件&#xff0c;它利用金属-半导体接触形成的肖特基势垒来实现整流功…

华为校招机试 - 满二叉搜索树查找(20240424)

在线OJ测试 题目详情 - 满二叉搜索树查找 - HydroOJ 题目描述 给定 (2^n) - 1 个不同的整数(1 ≤ n ≤ 10,n 为整数),构建一棵平衡满二叉搜索树。 二叉搜索树定义如下: 节点的左子树只包含小于当前节点的数节点的右子树只包含大于当前节点的数所有左子树和右子树自身必…

手把手教你在本机安装Stable Diffusion秋叶整合包

因为网上讲部署的文章挺多的&#xff0c;所以本来不打算写这个&#xff0c;但是有些网友提出了要求&#xff0c;另外我也准备总结下在AI绘画方面的一些经验&#xff0c;从经验完整性上考虑&#xff0c;还是得有这部分的内容。 整合包对非技术出身的同学比较友好&#xff0c;因为…

Linux学习(一)

笔者给各位读者的建议是每天背 30 个在电脑上看到的不认识的单词 1) 文件系统 提供计算机存储信息的结构&#xff0c;信息存储在文件中&#xff0c;文件主要存储在计算机的内部硬盘里&#xff0c;在目录的分层结构中组织文件。文件系统为操作系统提供了组织管理数据的方式。 …

银河麒麟V10 ARM64 离线安装 新版Docker

查询当前发行版本 nkvers下载最新版本 卸载旧依赖 卸载已经安装的老版本 yum remove docker \containerd.io \docker-runc \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-compo…

kubernetes 1.30.0 Containerd 离线搭建

准备 准备两台主机 主机名IPCPU架构mx-text-01192.168.0.222ARM64mx-text-02192.168.0.223ARM64 主机要求&#xff1a; 2Core 2G RAM 配置主机名映射 添加映射 192.168.0.222 mx-test-01 192.168.0.223 mx-test-02cat /etc/hosts关闭SELinux setenforce 0sed -i s/^SELI…