分治法求解棋盘覆盖问题

分治法求解棋盘覆盖问题

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

基本思路

棋盘覆盖问题是指在一个大小为2n * 2n的棋盘上,去掉其中一个方格后,用L型骨牌(覆盖3个方格)将其完全覆盖。分治法是一种解决该问题的有效算法。

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

代码实现

#include <stdio.h>
int board[100][100] = { 0 };
int tile = 1;
//棋盘覆盖 
void ChessBoard(int tr, int tc, int dr, int dc, int size) {
	if (size == 1)
		return;
	int t = ++tile,
		s = size / 2;
	//覆盖左上角棋盘
	if (dr < tr + s && dc < tc + s)
		//特殊方格在棋盘中
	{
		ChessBoard(tr, tc, dr, dc, s);
	}
	else {
		//特殊方格不在棋盘中,则从中间覆盖一个方格
		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 {
		//特殊方格不在棋盘中,则从中间覆盖一个方格
		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 {
		//特殊方格不在棋盘中,则从中间覆盖一个方格
		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 {
		//特殊方格不在棋盘中,则从中间覆盖一个方格
		board[tr + s][tc + s] = t; //赋值特殊方格类型
		ChessBoard(tr + s, tc + s, tr + s, tc + s, s);//从左下角继续划分 
	}
}
int  main(void) {
	int size, dr, dc;
	printf("请输入棋盘的行或列号:");
	scanf("%d", &size);
	printf("请输入特殊方格的行或列号:");
	scanf("%d %d", &dr, &dc);
	board[dr][dc] = 1;
	ChessBoard(0, 0, dr, dc, size);
	for (int i = 0;i < size;i++) {
		for (int j = 0;j < size;j++)
			printf("%d\t", board[i][j]);
		printf("\n");
	}
	return 0;
}

运行结果

在这里插入图片描述
如上图所示,相同的数字就代表了一个L型的骨牌。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【音视频|wav】wav音频文件格式详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

BLIP2中Q-former详解

简介 Querying Transformer&#xff0c;在冻结的视觉模型和大语言模型间进行视觉-语言对齐。 为了使Q-Former的学习达到两个目标&#xff1a; 学习到和文本最相关的视觉表示。 这种表示能够为大语言模型所解释。 需要在Q-Former结构设计和训练策略上下功夫。具体来说&…

零资源的大语言模型幻觉预防

零资源的大语言模型幻觉预防 摘要1 引言2 相关工作2.1 幻觉检测和纠正方法2.2 幻觉检测数据集 3 方法论3.1 概念提取3.2 概念猜测3.2.1 概念解释3.2.2 概念推理 3.3 聚合3.3.1 概念频率分数3.3.2 加权聚合 4 实验5 总结 摘要 大语言模型&#xff08;LLMs&#xff09;在各个领域…

Redis(windows+Linux)安装及入门

一、概述 Redis是什么&#xff1f; Redis(Remote Dictionary Server)&#xff0c;即远程字典服务 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数…

Android 主题 vs 样式

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关知识3.1 theme&#xff01; st…

取石子

每一堆数量都>1的话可以把合并操作和取石子看成一种操作&#xff0c;总操作数就是sumn-1&#xff0c;为奇数就是Alice先手必胜&#xff0c;哪怕有一堆是2&#xff0c;Bob取后变为1&#xff0c;Alice也可以通过合并操作让1变成>1的数 可以分成两大板块a、b, a中方石子个数…

【Vue】初步认识<script setup>语法糖和组合式 API

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ &#x1f6eb; 导读 需求 最近写代码的时候&#xff0c;发现<script setup>这样的代码&#xff0c;没见过&#xff0c;好奇&#xff0c;想知道。 所以就有了这篇文章。 很多文章都说setup是vue3的特权。但是&#xff…

图纸管理制度《六》

为建立健全机运系统技术档案管理工作&#xff0c;完整的保存和科学地管理机运系统的技术档案&#xff0c;充分发挥技术档案在我矿建设发展中的作用&#xff0c;更好地为我矿个生产技术部门服务&#xff0c;特制定本管理制度. 1、要把图纸、技术档案管理工作纳入技术业务工作中…

BSTree二叉树讲解

二叉搜索树的概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值…

【MATLAB】安装Psychtoolbox

目录 一、下载Psychtoolbox工具包 1. 一个是这个ZTP文件 2. 分别下载 Subversion 1.7.x command-line client 和 gstreamer.freedesktop.org 二、解压工具包&#xff0c;保存至同一文件 三、安装到matlab 1. 安装psychtoolbox 2. 检查是否安装成功 一、下载Psychtoolbox…

k8s statefulSet 学习笔记

文章目录 缩写: sts创建sts扩缩容金丝雀发布OnDelete 删除时更新 缩写: sts 通过 kubectl api-resources 可以查到&#xff1a; NAMESHORTNAMESAPIVERSIONNAMESPACEDKINDstatefulsetsstsapps/v1trueStatefulSetweb-sts.yaml apiVersion: v1 kind: Service metadata:name: ng…

[UDS] --- CommunicationControl 0x28

1 0x28功能描述 根据ISO14119-1标准中所述&#xff0c;诊断服务28服务主要用于网络中的报文发送与接受&#xff0c;比如控制应用报文的发送与接收&#xff0c;又或是控制网络管理报文的发送与接收&#xff0c;以便满足一定场景下的应用需求。 2 0x28应用场景 一般而言&#…

MAC安装stable diffusion

电脑配置 基本安装 1. 安装python 2. 安装git 3. 下载stable diffusion的代码&#xff0c;地址&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 执行命令 ./webui.sh --precision full --no-half-vae --disable-nan-check --api Command…

2023年阿里云双11优惠来了,单笔最高可省2400元!

2023年阿里云双11活动终于来了&#xff0c;阿里云推出了金秋云创季活动&#xff0c;新用户、老用户、企业用户均可领取金秋上云礼包&#xff0c;单笔最高立减2400元&#xff01; 一、活动时间 满减券领取时间&#xff1a;2023年10月27日0点0分0秒-2023年11月30日23点59分59秒 …

商业模式画布的9大模块全解读,产品经理不可不知!

“商场如战场”&#xff0c;在当今瞬息万变的商业环境中&#xff0c;创造出独特且创新的商业模式是每个企业家、策略家和决策者的首要任务。为了在激烈的市场竞争中取得优势&#xff0c;我们需要一个强大且直观的工具来帮助我们规划和塑造公司的商业模式&#xff0c;这个经常被…

Websocket传递JWT令牌

在访问带有[Authorize]的方法的时候&#xff0c;需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证&#xff0c;否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时&#xff0c;…

生物信息学分析-blast序列比对及结果详细说明

1. 软件说明 Blast是一种基于序列比对的分析工具&#xff0c;可以用于寻找生物序列之间的同源性&#xff0c;它的全称是Basic Local Alignment Search Tool。 Blast有多种版本和用途&#xff0c;最常见的是基于Web的Blast和本地安装的Blast程序。Web版Blast可以直接在NCBI网站…

【MATLAB源码-第62期】基于蜣螂优化算法(DBO)的无人机三维地图路径规划,输出最短路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜣螂优化算法&#xff08;Dung Beetle Optimization, DBO&#xff09;是一种模拟蜣螂在寻找食物和进行导航的过程的优化算法。蜣螂是一种能够将粪球滚到合适地点的昆虫&#xff0c;它们利用天空中的光线和自身的感知能力来确…

【EI会议征稿】第三届绿色能源与电力系统国际学术会议(ICGEPS 2024)

第三届绿色能源与电力系统国际学术会议&#xff08;ICGEPS 2024&#xff09; 2024 3rd International Conference on Green Energy and Power Systems 绿色能源是指可以直接用于生产和生活的能源。它包括核能和“可再生能源”。随着世界各国能源需求的不断增长和环境保护意识…

一文告诉你样机是什么,分享几个常用的样机模板

一个项目的诞生通常需要经历头脑构思、绘制设计和最终着陆。在这个过程中&#xff0c;样机制作往往是在着陆实践之前进行的。俗话说&#xff1a;“样机使用得好&#xff0c;草稿过早”。样机设计是产品或网站最终设计的生动、静态和视觉表现。它为用户提供了一种模拟现实的方式…