棋盘覆盖问题(Java)

news2024/12/25 9:25:36

文章目录

  • 棋盘覆盖问题(Java)
    • 1、问题描述
    • 2、算法设计思路
    • 3、代码实现
    • 4、复杂度分析
    • 5、参考


在这里插入图片描述


棋盘覆盖问题(Java)

1、问题描述

在一个2k×2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘。显然特殊方格在棋盘上出现的位置有4k 种情形.因而对任何k ≥ 0,有4k种不同的特殊棋盘。如下图中的特殊棋盘是当k = 2时16个特殊棋盘中的一个。
在这里插入图片描述

在棋盘覆盖问题中,要用下图所示的4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。易知,在任何一个2k×2k的棋盘覆盖中,用到的L型骨牌个数恰好为(4k - 1)/3。

在这里插入图片描述

2、算法设计思路

使用分治策略,可以设计出解棋盘覆盖问题的简洁算法。

k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘,如下图(a)所示。

特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如下图(b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1
在这里插入图片描述

3、代码实现

特殊棋盘我们采用0来表示,同时假设特殊方格的位置为第三行第三列

棋盘一分为四之后,依次覆盖左上角子棋盘、右上角子棋盘、左下角子棋盘、右下角子棋盘。如若特殊方格在子棋盘中,则递归执行该子棋盘的操作;若不在,对于左上角子棋盘、右上角子棋盘、左下角子棋盘、右下角子棋盘而言,用编号为t的L型骨牌依次覆盖右下角、左下角、右上角、左上角的方格。

在这里插入图片描述

/**
 * TODO  棋盘覆盖算法 特殊棋盘我们采用0来表示
 *
 */
public class chessBoard {

    static final int SIZE = 4;
    static int[][] board = new int[SIZE][SIZE];
    static int title = 1; // title表示L型骨牌的编号

    public static void main(String[] args) {
        // TODO 假设特殊方格的位置为第三行第三列
        board[2][2] = 0;
        ChessBoard(0, 0, 2, 2, SIZE);

        System.out.println(SIZE + "*" + SIZE + "的L型骨牌棋盘为:");
        for (int i = 0; i < SIZE; ++i) {
            for (int j = 0; j < SIZE; j++) {
                System.out.print(board[i][j] + "  ");
            }
            System.out.println();
        }
    }


    /**
     *
     * @param tr    表示棋盘左上角行号
     * @param tc    表示棋盘左上角列号
     * @param dr    表示特殊棋盘的行号
     * @param dc    表示特殊棋盘的列号
     * @param size  =2^k。棋盘的规格为2^k*2^k
     */
    public static void ChessBoard(int tr, int tc, int dr, int dc, int size) {
        if (size == 1) {
            return;
        }
        int t = title++;    // t表示L型骨牌的编号
        int s = size / 2;   // 分割的子棋盘的规格大小(切分为4个子棋盘)

        // TODO 1.覆盖左上角子棋盘
        if (dr < tr + s && dc < tc + s) {
            // TODO 说明特殊方格在此子棋盘中
            ChessBoard(tr, tc, dr, dc, s);
        } else {
            // TODO 说明特殊方格不在此子棋盘中
            //  用t号L型棋盘覆盖这个子棋盘的右下角
            board[tr + s - 1][tc + s - 1] = t;
            // TODO 覆盖其余棋盘方格
            ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
        }

        // TODO 2.覆盖右上角子棋盘
        if (dr < tr + s && dc >= tc + s) {
            ChessBoard(tr, tc + s, dr, dc, s);
        } else {
            // 用t号L型棋盘覆盖这个子棋盘的左下角
            board[tr + s - 1][tc + s] = t;
            ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);
        }

        // TODO 3.覆盖左下角子棋盘
        if (dr >= tr + s && dc < tc + s) {
            ChessBoard(tr + s, tc, dr, dc, s);
        } else {
            // 用t号L型棋盘覆盖这个子棋盘的右上角
            board[tr + s][tc + s - 1] = t;
            ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);
        }

        // TODO 4.覆盖右下角子棋盘
        if (dr >= tr + s && dc >= tc + s) {
            ChessBoard(tr + s, tc + s, dr, dc, s);
        } else {
            // // 用t号L型棋盘覆盖这个子棋盘的左上角
            board[tr + s][tc + s] = t;
            ChessBoard(tr + s, tc + s, tr + s, tc + s, s);
        }

    }
}

4、复杂度分析

设T(k)是算法chessBoard覆盖一个2k×2k棋盘所需的时间。从算法的分隔策略可以知道,T(k)满足以下的递归方程:

  • 当k = 0时,T(k) = O(1),

  • 当k > 0时,T(k) = 4T(k - 1) + O(1)

最终此递归方程可得:T(n) = O(4k)。
由于覆盖2k×2k棋盘所需的L型骨牌个数为(4k - 1)/3,所以此算法是一个在渐进意义下的最优算法。
在这里插入图片描述

5、参考

  • 算法分析与设计(第四版)

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

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

相关文章

D. Radio Towers(斐波那契+逆元)

Problem - 1452D - Codeforces 在一条坐标线上有n2个城镇&#xff0c;编号从0到n1。第i个城镇位于第i点。 你在1,2,......,n个镇上各建一座无线电塔&#xff0c;概率为12&#xff08;这些事件是独立的&#xff09;。之后&#xff0c;你想把每个塔的信号功率设置为1到n的某个整…

OpenGL 透明度

目录 一.OpenGL 透明度 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 透明度 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 &…

轻松使用TomCat、Maven和Servlet

文章目录TomcatTomcat下载启动Tomcat启动Tomcat失败的原因使用TomcatMaven创建Maven项目Maven依赖管理Servlet1.创建Maven项目2.引入依赖3.构建目录结构4.编写Servlet代码5.程序打包6.程序部署7.验证程序使用IDEA上Tomcat插件简化步骤5和步骤6Tomcat Tomcat 就是基于 Java 实现…

单点登录等功能该用 Keycloak 这种开源框架实现吗?

Keycloak 是一个开源软件产品&#xff0c;旨在为现代的应用程序和服务&#xff0c;提供包含身份管理和访问管理功能的单点登录工具。 开源软件虽然能够定制和修改源代码&#xff0c;还可以降低开发成本&#xff0c;但是 Keycloak 实现起来还是有不少问题&#xff1a; 用户迁移…

python实现五子棋游戏(pygame版)(附零基础学习资料)

前言 使用python实现pygame版的五子棋游戏&#xff1b; 环境&#xff1a;Windows系统python3.8.0 &#xff08;文末送读者福利&#xff09; 游戏规则&#xff1a; 1、分两位棋手对战&#xff0c;默认黑棋先下&#xff1b;当在棋盘点击左键&#xff0c;即在该位置绘制黑棋&a…

APT 攻击溯源方法

概述&#xff1a; 当今世界正值百年未有之大变局&#xff0c;网络空间成为继陆、海、空、天之后的第五大疆域&#xff0c;安全威胁也随之延伸至网络空间。没有网络安全就没有国家安全&#xff0c;在新时代网络空间安全已经上升至国家安全的高度。高级持续性威胁(Advanced Pers…

yolov1模型

目录 一、机器视觉算法 二、yolov1 预测阶段&#xff08;向前推断&#xff09;​ 三、预测阶段的后处理 &#xff08;声明&#xff1a;本文章是在学习他人视频的学习笔记&#xff0c;图片出处均来自该up主&#xff0c;侵权删 视频链接&#xff1a;为什么要学YOLOV1_哔哩哔哩_b…

拿铁DHT-PHEV座舱智能程度体验笔记(超详细)

评测时间&#xff1a; •第一次 2022年10月1日-10月7日 •第二次 2022年10月25日 评测配置&#xff1a; •两驱超大杯 18.98万元好评功能盘点 座舱芯片及内存&#xff1a;高通骁龙 8155&#xff0c;算力8TOPS&#xff0c;存储8GB&#xff0c;内存12G&#xff0c;一流的配置。 四…

领悟《信号与系统》之 连续时间信号的时域分析法

连续时间信号的时域分析法一、LTI 连续系统的响应1. LTI 微分方程的建立与求解2. LTI 连续系统的零输入响应与零状态响应1. 零输入响应2. 零状态响应3. 全响应二、冲激响应和阶跃响应1. 冲激响应2. 阶跃响应三、卷积积分及其性质1. 任意信号的分解2. 任意信号作用下的零状态响应…

一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧

1. 判断对象的数据类型 使用 Object.prototype.toString 配合闭包&#xff0c;通过传入不同的判断类型来返回不同的判断函数&#xff0c;一行代码&#xff0c;简洁优雅灵活&#xff08;注意传入 type 参数时首字母大写&#xff09; 不推荐将这个函数用来检测可能会产生包装类型…

【跨境电商】6种实用有效的策略帮助改善客户沟通

关键词&#xff1a;跨境电商卖家、客户沟通 1.什么是客户沟通&#xff1f; 客户沟通是公司与消费者的互动。品牌识别接触点并通过各种渠道&#xff08;例如电话、电子邮件和实时聊天&#xff09;在每个接触点建立关系。公司可以通过始终如一的参与并将消费者置于这种互动的中心…

【Redis】内存回收:内存淘汰策略

【Redis】内存回收&#xff1a;内存淘汰策略 文章目录【Redis】内存回收&#xff1a;内存淘汰策略一、Redis内存回收-过期key处理二、Redis内存回收-内存淘汰策略一、Redis内存回收-过期key处理 如果你发现&#xff0c;平时在操作 Redis 时&#xff0c;并没有延迟很大的情况发生…

Watermelon Book(二)线性模型

文章目录线性回归对数几率回归线性类别分类多分类学习类别不平衡问题基本形式&#xff1a;若给定 d个属性描述的示例x(x1,x2,x3…xd)&#xff0c;则线性模型试图学得一个 通过属性的线性组合来进行预测。f(x)W1*X1W2*X2...Wn*Xnw(T)xbw(w1;w2;w3;wn;)线性模型形式简单、易于建模…

[附源码]java毕业设计校园共享单车系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

排序算法——七种排序算法汇总,详细

文章目录排序排序的概念及应用一、直接插入排序1. 简介2.动图展示3.过程4.代码5.总结二、希尔排序1.简介2.过程3.代码4.总结三、选择排序1.简介2.代码3.总结四、堆排序1.代码2.总结五、冒泡排序1.过程2.代码3.总结六、快速排序1.简介2.过程3.两种优化快速排序的思想4.代码-递归…

【附源码】计算机毕业设计JAVA学生校内兼职管理平台

【附源码】计算机毕业设计JAVA学生校内兼职管理平台 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

什么是 SSH 密钥? 生成、身份验证、密钥对信息等

SSH 密钥不仅可以提高安全性&#xff0c;还可以实现当今企业所需的大规模连接流程、单点登录 (SSO) 以及身份和访问管理的自动化。 什么是 SSH 密钥&#xff1f; SSH 密钥是安全外壳 (SSH) 协议中使用的安全访问凭证。 SSH 密钥使用基于公钥基础设施 (PKI) 技术&#xff08;数…

Android12窗口模糊(二)高斯模糊API源码解析

前言 在 Android 12 中&#xff0c;提供了一些用于实现窗口模糊处理效果&#xff08;例如背景模糊处理和模糊处理后方屏幕&#xff09;的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。 有两种窗口模糊处理方式&#xff0c;可用于实现不同的视觉效果…

不小心清空了回收站怎么恢复,回收站删除的东西可以恢复吗

不小心清空了回收站怎么恢复&#xff1f;回收站是操作系统提供的一个非常实用的功能&#xff0c;专门为用户保存从电脑硬盘删除的各种数据&#xff0c;因而很多时候我们都会用到回收站&#xff0c;它能够保存各种数据&#xff0c;我们也能够在里面恢复自己想要的数据&#xff0…

Flutter组件--AppBar相关属性

AppBar介绍 AppBar是基于Material Design设计风格的应用栏&#xff0c;一般使用在Scaffold内部&#xff0c;作为顶部导航栏。 为什么需要AppBar 1、因为导航栏里面一般由左侧功能键&#xff08;返回键、菜单键&#xff09;、标题、右侧功能键组成&#xff0c;而AppBar里面内置…