分治策略之棋盘覆盖问题(ChessBoard)

算法:棋盘覆盖问题(C版) 阅读详情

在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。


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

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


将棋盘保存在一个二维数组中。骨牌号从1开始,特殊方格为0,如果是一个4 * 4的棋盘,特殊方格为(2,2),那么程序的输出为

2   2   3   3   
2   1   1   3   
4   1   0   5   
4   4   5   5
 
相同数字的为同一骨牌。


//棋盘覆盖(递归)
#include <iostream>
#include<iomanip>
using namespace std;

/**
    tr:棋盘左上角方格的行号;
    tc:棋盘左上角方格的列号;
    dr:特殊方格所在的行号;
    dc:特殊方格所在的列号;
    title:全局整型变量;
    Board[N][N]:棋盘方格;N为2的倍数;
*/

static int title = 1;
const int N = 8;
int Board[N][N] = {0};

void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
    if(size == 1)
        return;
    int t = 0,s = 0;
    t = title++;         //L型骨牌号
    s = size/2;             //分割棋盘

    //覆盖左上角子棋盘
    if(dr < tr+s && dc < tc+s )
    {
        //特殊方格在此棋盘中
        ChessBoard(tr,tc,dr,dc,s);
    } else {
        //此棋盘中无特殊方格
        //用t号L型骨牌覆盖右下角
        Board[tr+s-1][tc+s-1] = t;
        //覆盖其余方格
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);
    }



    //覆盖右上角子棋盘
    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);
    }


    //覆盖左下角子棋盘
    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);
    }


    //覆盖右下角子棋盘
    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);
    }

}

int main()
{
    cout<<"请输入特殊盘的下标号:"<<endl;
    int x,y;
    cout<<"行: ";
    cin>>x;
    cout<<"列: ";
    cin>>y;
    cout<<endl;
    ChessBoard(0,0,x,y,N);
    cout<<endl;
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < N; j++)
        {
            cout<<setw(4)<<Board[i][j];
        }
        if(0 == i/N)
            cout<<endl;
    }
    return 0;
}

JAVA算法:棋盘覆盖算法(经典算法问题) JAVA算法:棋盘覆盖算法(经典算法问题) 经典算法问题:在一个2^k×2^k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4^k种,因而有4^k种不同的棋盘,下图(1)所示是k=2时16种棋盘中的一个。棋盘覆盖问题(chess cover problem)要求用图(2)所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以... 阅读详情

相关推荐

ChessBoard(分治法之棋盘覆盖)

ChessBoard(分治法之棋盘覆盖) 计算机算法设计与分析实验,分治法做棋盘覆盖 vc6.0中编译通过

《ChessboardCoverage_棋盘覆盖问题》

public class ChessboardCoverage { /** * @param args */ public static int tile; public static int[][] Chessboard; public static void main(String[] args) { int num = 16; Chessboard = new i

ubuntuixp 628

棋盘覆盖问题ChessBoard.java

通过将规模为n的问题分解为k个规模较小的问题,这就是分治思想。棋盘覆盖每次将棋盘规模减小一半,直到问题得到解决。

分治策略------棋盘覆盖(ChessBoard)

棋盘覆盖原理 棋盘覆盖运用的是分治策略。 1.分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。 2.k>0时,可将2k×2k的棋盘划分为4个2(k-1)×2(k-1)的子棋盘。这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。 3.为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,从而

weixin_43873373的博客 2990

棋盘覆盖算法(分治算法)

一个c++代码。残缺棋盘(defective chessboard)是一个有2k×2k 个方格的棋盘,其中恰有一个方格残缺。图2 - 3给出k≤2时各种可能的残缺棋盘,其中残缺的方格用阴影表示。注重当k= 0时,仅存在一种可能的残缺棋盘(如图1 4 - 3 a所示)。事实上,对于任意k,恰好存在22k 种不同的残缺棋盘。

棋盘覆盖(采用ChessBoard算法)

该程序采用ChessBoard算法实现了棋盘覆盖,可定义棋盘大小,可定义残缺棋盘位置,采用图形界面实现

ChessBoard棋盘覆盖问题

棋盘覆盖问题是一个经典的分治问题的算法,它其中的思想,就是分而治之。          怎么体现分而治之的思想是这个问题的关键。          首先,将棋盘分为四个小的方块,体现了分,但是却破坏了问题的统一性,因为小的方块中,三个块中没有特殊的方块。         所以为了不破坏分而不乱的思想,我们可以在每一个小块中加一个特殊的小方块,但是加一个小方块,随便填的话,同样还是破坏了分的目

逐梦科学 2359

简单的服务器取证

记一次入门服务器取证——药品直销网,涵盖旧版本宝塔、静态IP的配置更改、代码的理解

m0_74559567的博客 3756

分治与递归:棋盘覆盖问题

#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; using namespace std; int Board[8][8];//描述棋盘的二维数组 void ChessBoard(int tr,int tc,int dr,int dc,int size,int &amp;tile,int Board[...

小龙虾 412

【无标题】STM32F767串口空闲中断+DMA实现不定帧长度的接收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、配置串口与DMA二、空闲中断服务函数二.串口+DMA发送三、主函数总结 前言 提示:这里可以添加本文要记录的大概内容: 使用STM32F767实现串口空闲中断+DMA传输接收不定帧长度数据,以及当中可能遇到的错误总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、配置串口与DMA //硬件模块配置可直接通过CUBEMX配置 void MX_USART1_UART_Init(void) { huart1.In.

qq_42589531的博客 1167

Beyond the Spec: Decoding Samsung‘s LPDDR6 Sub-Channel and Wide-NRZ Innovations

本文深入解析了三星LPDDR6内存的两大核心技术:Sub-Channel架构与Wide-NRZ信号技术。Sub-Channel架构通过将物理通道划分为多个独立子通道,实现了内存访问的细粒度控制,大幅提升了能效,尤其适用于AI与边缘计算场景。Wide-NRZ则通过增加并行数据线而非采用PAM4,在提升带宽的同时保持了优异的信号完整性与低功耗特性。

weixin_29209801的博客 134

2.6 棋盘覆盖

格就成为该棋盘上的特殊方格,从而将原问题转化为 4个较小规模的棋盘覆盖问题。在棋盘複盖问题中,要用图2-5 所示的 4种不同形态的工 型骨牌覆盖一个给定的特殊棋。型骨牌覆盖这了个较小棋盘的会合处,如图2-6(所示,这了个子棋盘上被L型骨牌覆盖的方。是算法中的一个全局性型交量,用表示工 型骨牌的编号,其初始值为 0。在一个2*x2‘个方格组成的棋盘中,若怡有一个方格与其他方格不同,则称该方格为。特殊方格,且称该棋盘为一特殊棋盘。2*x2*的棋盘覆盖中,用到的L 型骨牌个数恰为(45-1)/3。

tang7mj的博客 324

Coze离线部署实战:从镜像拉取到服务启动的完整避坑指南

本文提供了一份详尽的Coze平台离线部署实战指南。针对无外网的生产环境,详细讲解了从Docker镜像拉取、打包传输到内网服务器加载的完整流程,并重点剖析了使用docker-compose启动服务时常见的配置错误与权限问题,如文件挂载缺失、网络绑定错误等,提供了经过验证的避坑解决方案,旨在帮助运维和开发人员一次性成功部署。

weixin_29310605的博客 326

2k*2k 棋盘覆盖问题

棋盘覆盖问题 问题叙述 在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 图示: 实例: 2. 基本思路: 关注的重点是特殊方格,2k2k的棋盘上如果没有特殊点,那么L型骨牌不可能完全覆盖,那么我们分治...

weixin_43931548的博客 8220

AI:240-YOLOv8高效涨点 |Swin Transformer的主干网络替换与优化(附代码 + 详细修改步骤 +原理介绍)

YOLOv8作为目标检测领域的最新版本,在速度和精度之间取得了良好的平衡。然而,随着计算机视觉任务的复杂性不断增加,YOLOv8的标准主干网络(Backbone)在处理高分辨率图像或多尺度目标时,可能存在一定的局限性。为了进一步提升YOLOv8的性能,我们可以引入Swin Transformer替换其主干网络,以增强模型的全局感知能力和多尺度特征提取能力。本文将详细介绍如何在YOLOv8中用Swin Transformer替换原有的Backbone,提供代码示例,并深入探讨其中的原理和效果。

一键难忘的博客 3957

Python 爬虫实战:爬取评论数据做情感分析

摘要:本文介绍基于Python的京东商品评论爬取与情感分析全流程实现。通过Requests库抓取评论数据接口,结合JSON解析获取结构化评论信息。利用SnowNLP进行中文文本情感分析,量化用户评价的情感倾向(正面/负面/中性)。结果显示正面评论占比66.3%,负面评论13.3%,关键词分析发现"卡顿""发热"是主要负面因素。该方法可应用于产品优化、品牌管理等场景,为决策提供数据支持。

2503_91057718的博客 1708

递归分治解决棋盘覆盖问题

经典的递归分治策略

xiuweikang的专栏 1009

手把手教你学Simulink——基于传统电网建模与稳定性分析的场景实例:基于同步发电机的单机无穷大系统建模与稳定性分析

本文详细介绍了使用MATLAB/Simulink进行单机无穷大系统(SMIB)建模与稳定性分析的方法。教程从系统结构设计入手,包含同步发电机、输电线路、无穷大母线等核心模块的建模步骤和参数配置示例。重点讲解了七个关键步骤:项目创建、模块配置、控制系统集成、负载添加(可选)以及仿真运行与结果分析,并提供了具体的MATLAB代码示例。最后通过性能评估指标(功角差、电压跌落、频率偏差)分析系统稳定性,为电力系统动态特性研究提供了实用指导,强调准确参数设置对仿真结果的重要性。

MHD0815的博客 298

java棋盘覆盖分治法,棋盘覆盖问题 —— 分治法

/*分治法实现棋盘覆盖问题*/#include//tr:棋盘左上角方格的行号 tc:棋盘左上角方格的列号//dr:特殊方格的行号 dc:特殊方法的列号//size:size=2的k次方,棋盘规格为2的k次方//tile:L型骨牌的编号,初始值为1int Board[100][100];int tile=1;void ChessBoard(int tr,int tc,int dr,i...

weixin_42592399的博客 441

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真

本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。

amy_mhd的博客 85

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

棋盘覆盖问题(递归与分治)

棋盘覆盖问题。有一个2k∗2k2k∗2k的方格棋盘,恰有一个方格是黑色的,其他为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。如图所示为L型牌的4种旋转方式。 当一个黑块位于某一角时,可以解决一个边长为2的正方形匹配。可是这样只解决了一个正方形,想解决其他正方形,需要为其他每个正方形在某一角增加一个黑块,然后该问...

weixin_43568895的博客 669

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

算法学习笔记:分治策略

分治策略是一种常用的算法设计技术,适用分治策略设计的算法通常是递归算法。字面上的解释是【分而治之】,就是把一个复杂的问题分成两个或更多的相同的或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅里叶变换(快速傅里叶变化)。分治算法通常以数学归纳法来验证,而它的计算则多数以解递归关系来判定。

m0_64448698的博客 903

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

算法设计棋盘覆盖问题c语言,棋盘覆盖问题(用分治法求解)

// 棋盘覆盖#include#include int Board[8][8]={0};//定义棋盘并初始化棋盘void ChessBoard(int tr,int tc,int dr,int dc,int size,int &tile);void main(){int tile=0;cout<int x,y;cin>>x>>y;ChessBoard(0,0,...

weixin_39892800的博客 873

java棋盘覆盖分治法_棋盘覆盖问题(用分治法求解)

// 棋盘覆盖#include#include int Board[8][8]={0};//定义棋盘并初始化棋盘void ChessBoard(int tr,int tc,int dr,int dc,int size,int &tile);void main(){int tile=0;cout<int x,y;cin>>x>>y;ChessBoard(0,0,...

weixin_36315079的博客 437

棋盘覆盖问题-递归分治

#include #include using namespace std; int Board[20][20]; int tile=1; void ChessBoard(int tr,int tc,int dr,int dc,int size){ if(size==1) return; int t =tile++; int s=size/2;

认真你就输了 796

python棋盘覆盖问题_python自带tkinter库实现棋盘覆盖图形界面

python实现棋盘覆盖图形界面,供大家参考,具体内容如下一、解决方案和关键代码工具:python tkinter库问题描述:在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘。在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个...

weixin_39725154的博客 567
上一篇: Code:Blocks 中文乱码问题原因分析和解决方法!
下一篇: 贪心算法之多机调度问题
Hy_Fighting
博客等级 码龄15年 11粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值