算法设计与分析——递归与分治策略——棋盘覆盖

问题描述
棋盘覆盖问题要求在2^k * 2^k 个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖。

建立模型如图:

解决方案就是利用分治法,将方形棋盘分成4部分,如果该特殊点在某一部分,我们就去递归他,如果不在某一部分,我们假设一个点为特殊点,同样递归下去,知道全覆盖。

左上角的子棋盘(若不存在特殊方格):则将该子棋盘右下角的那个方格假设为特殊方格;

右上角的子棋盘(若不存在特殊方格):则将该子棋盘左下角的那个方格假设为特殊方格;

左下角的子棋盘(若不存在特殊方格):则将该子棋盘右上角的那个方格假设为特殊方格;

右下角的子棋盘(若不存在特殊方格):则将该子棋盘左上角的那个方格假设为特殊方格;

在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:
在这里插入图片描述

在这里插入图片描述

实现的基本原理是将2^k * 2k的棋盘分成四块2(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图所示:

在这里插入图片描述

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int tile = 1;
int Borad[100][100];
/*** tr : 棋盘左上角的行号,tc棋盘左上角的列号* dr : 特殊方格左上角的行号,dc特殊方格左上角的列号* size :size = 2^k 棋盘规格为2^k*2^k*/
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{if(size==1)return;int t = tile++;int s = size / 2;if( dr< tr+s && dc< tc+s )//特殊方格在棋盘的左上角{ChessBoard(tr, tc, dr, dc, s);}else//特殊方格不在棋盘的左上角时;{Borad[tr + s-1][tc + s-1] = t;ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);}if( dr< tr+s && tc+s <=dc )//特殊方格在棋盘的右上角{ChessBoard(tr, tc + s, dr, dc, s);}else//特殊方格不在棋盘的右上角{Borad[tr + s-1][tc + s]=t;ChessBoard(tr, tc + s, tr + s-1, tc + s , s);}if( tr+s<= dr && dc < tc+s )//特殊方格在棋盘的左下角{ChessBoard(tr + s, tc, dr, dc, s);}else//特殊方格不在棋盘的左下角{Borad[tr+s][tc+s-1]=t;ChessBoard(tr + s, tc, tr+s, tc+s-1, s);}if( tr+s <= dr && tc+s <= dc )//特殊方格在棋盘的右下角{ChessBoard(tr + s, tc + s, dr, dc, s);}else//特殊方格不在棋盘的右下角{Borad[tr + s][tc + s]=t;ChessBoard(tr + s, tc + s, tr+s, tc+s, s);}}
int main()
{cout << "输入K的值:";int k;cin >> k;int temp = 1;for (int i = 0; i < k;i++){temp = temp * 2;}int size = temp;int x, y;//存储特殊点所在的行列cout << "输入特殊点在的行,列:(表示特殊点的值为-1):";cin >> x >> y;Borad[x][y] = -1;ChessBoard(0, 0, x, y, size);for (int i = 0; i < size;i++){for (int j = 0; j < size;j++){cout <<setw(4)<< Borad[i][j]<<" ";}cout << endl;}system("pause");}

上述算法中:
使用了一个二维数组Board[][]表示棋盘,Board[0][0]是棋盘左上角的方格,tile是算法中的一个全局变量,用来表示L型骨牌,其初始值为0。
tr:棋盘左上角方格的行号
tc:棋盘左上角方格的列号
dr:特殊方格的行号
dc:特殊方格的列号
size:size=2^k,
棋盘的规格=2^K* 2^K
在这里插入图片描述
在这里插入图片描述

标记的次序:
在这里插入图片描述

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

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

相关文章

函数求值需要运行所有线程_JavaScript函数式编程(二)

纯函数就是&#xff0c;对于相同的输入&#xff0c;永远会得到相同的输出&#xff0c;而且没有任何可观察的副作用&#xff0c;也不依赖外部环境的状态但是实际的编程中&#xff0c;特别是前端的编程范畴里&#xff0c;“不依赖外部环境”这个条件是根本不可能的&#xff0c;我…

如何在 C# 中使用 RabbitMQ

译文链接&#xff1a;https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.htmlRabbitMQ 是一个非常流行的&#xff0c;开源的&#xff0c;使用Erlang语言编写的框架&#xff0c;通常在电信级平台中作为消息中间件使用&#xff0c;RabbitMQ实现了高级的…

算法设计与分析——递归与分治——归并排序

归并排序采用的是一种分治的思想&#xff0c;如下图&#xff0c;先将要排序的元素分为两块&#xff0c;每个块又开始分裂&#xff0c;然后逐个按照特定顺序合并&#xff0c;合成最后我们需要的数组。 归并排序的复杂度&#xff1a; 时间复杂度&#xff1a;O(nlogn) 空间复杂度&…

git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!

不少小伙伴私信问我GitHub怎么使用&#xff1f;今天更一下&#xff0c;希望能帮到你&#xff0c;有问题评论区拍砖交流吧。

在传统行业做数字化转型之业务篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第307篇原创内容在过去的两年时间里&#xff0c;我加入了一家传统行业的企业参与其数字化转型的过程&#xff0c;现在我将我的经历分享出来&#xff0c;本文是第三部分—业务篇&#xff0c;主要会介绍一下传统企业通用的三大…

算法设计与分析——递归与分治策略——快速排序

快速排序——递归算法 处理i,j的先后顺序不能改变 快速排序的基本思想&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序。 函数…

git pull 覆盖本地_SVN与Git比较的优缺点差异

一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器&#xff0c;保存所有文件的修订版本&#xff0c;而协同工作的人们都通过客户端连到这台服务器&#xff0c;取出最新的文件或者提交更新。Subversion的特点概括起…

C#阻塞队列BlockingCollection

BlockingCollection是一个比较冷门的类&#xff0c;我们先看下官方对这个类的定义&#xff1a;简单来说&#xff0c;BlockingCollection就是一个线程安全的阻塞队列&#xff0c;利用阻塞这个特性&#xff0c;我们可以实现进程内的生产者-消费者模式&#xff0c;比如消息转发、日…

算法设计与分析——递归与分治策略——线性时间选择

顾名思义&#xff1a;这篇文章讲解的就是如果用线性时间算法来作出元素选择问题。 问题描述&#xff1a;给定线性序集中n个元素和一个整数k&#xff0c;1<k<n.要求找出这n个元素中第k小的元素&#xff0c;即如果将这个n个元素依其线性序排列时&#xff0c;排在第k个位置的…

如何在 .NET 中使用 Redis缓存

译文链接&#xff1a;https://www.infoworld.com/article/3187905/how-to-work-with-redis-cache-in-net.html缓存是一种状态管理机制&#xff0c;通常用于提升你的应用程序性能&#xff0c;它很大程度上能够减少一个请求对你系统资源的消耗。Redis是一个开源的&#xff0c;高性…

git push被拒绝_规范git项目提交并自动生成项目commit log

commit message 是开发的日常操作, 好的 log 不仅有助于他人 review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是在平时工作时&#xff0c;只依赖大致的开发规范和自觉&#xff0c;很难形成一种普遍约束。而通过本文&#xff0c;对项目进行一些基础配置&…

算法设计与分析——递归与分治策略——全排列

算法设计与分析——递归与分治策略——全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位&#xff0c;如果递归到了最后一位&#xff0c;则输出他当前的全排列序列。 如果没有到达最后一位&#xff0c;则循环的交换该第K个元素与其后面的所有…

asp.net core 集成 prometheus

asp.net core 集成 prometheusIntroPrometheus 是一个开源的现代化&#xff0c;云原生的系统监控框架&#xff0c;并且可以轻松的集成 PushGateway, AlertManager等组件来丰富它的功能。对于 k8s 下部署的系统来说使用 Prometheus 来做系统监控会是一个比较不错的选择&#xff…

vba 不等于_EXCEL中VBA基础语句(1)

萌二笔记分类目录及书单一、If-Then语句 说明&#xff1a;条件判断&#xff0c;如果......那么......例1&#xff1a;A2单元格的成绩大于等于60&#xff0c;则弹出对话框提示“及格”。Sub 判断成绩()If Range("A2") > 60 Then MsgBox "及格"End Sub操作…

PHP大势已去,PHP宝藏可为我所用

编者注&#xff1a; PHP有着庞大的生态系统&#xff0c;还是可以为我dotnet所用&#xff1a;介绍一个基于 .NET 的船的新 PHP SDK Runtime: PeachPie。PHP 8 昨天发布了&#xff0c;今天不写代码&#xff0c;聊聊我对 PHP 的看法。昨天在今日头条发了一条微头条&#xff0c;引…

leetcode——242. 有效的字母异位词

问题描述&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如…

python常用函数和操作_python一条语句分析几个常用函数和概念 -

前言 过年也没完全闲着&#xff0c;每天用一点点时间学点东西&#xff0c;本文为大家介绍几个python操作的细节&#xff0c;包含all、any、for in等操作&#xff0c;以及介绍我解决问题的思路。 一、开篇 先从我看到的一个简单的语句开始。 刚看到这个语句的时候我整个人完全懵…

.NET5发布了,腾讯招聘点名要求精通MySQL,而不是SQLServer!

.NET5正式发布&#xff0c;社区一片欢腾&#xff0c;.NET相关技术栈也会迎来大变革&#xff0c;而大厂的招聘要求可谓是技术风向标&#xff01;紧盯腾讯网易顺丰等大厂的招聘&#xff0c;会发现都在明确要求。MySQL&#xff0c;而不是SQL Server了。究其根本&#xff0c;还是跨…

leetcode——344. 反转字符串

leetcode——344. 反转字符串 问题概述&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假…

python面向对象编程思想书籍_Python的面向对象编程思想

什么是Python的多态&#xff1f;多态的好处就是&#xff0c;当我们需要传入Dog、Cat、Tortoise……时&#xff0c;我们只需要接收Animal类型就可以了&#xff0c;因为Dog、Cat、Tortoise……都是Animal类型&#xff0c;然后&#xff0c;按照Animal类型进行操作即可。由于Animal…