棋盘覆盖问题(保姆级解释)
这可是保姆级解释哦!
1、问题描述:
在一个个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。棋盘覆盖问题要求用如图所示的4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
2、问题分析过程:
① 显然,用户输入k的值(k必须为自然数),然后再输入特殊方格的坐标(坐标的格式会在下面提到),这样便可以确定一个带有一个特殊方格的的棋盘(尚未被覆盖),接下来交由计算机使用上图四种L型骨牌进行覆盖操作。这种覆盖操作具体的形式是什么呢?
② 可以用一个二维数组chessBoard来表示这个的棋盘,该二维数组规模为
,每个棋盘的方格用chessBoard[i][j]来表示
但是用户认为一个棋盘最左上角的方格坐标应该为而不是
,这点需要注意。当用户指定并输入特殊方格的坐标为
时,代表着chessBoard[1][2] = 特殊方格对应的值。
③ (1)为了找到覆盖操作的规律,假设用户输入的,即创建一个
的棋盘,然后用户输入特殊方格的坐标为
,则chessBoard[1][2]填充为黑色,如图1-1所示:(为便于编程,接下来这个用户输入的特殊方格都用
表示)
图1-1
(2) 将这个棋盘均等分为4个
子棋盘,可以发现特殊方格
位于左上角
子棋盘中,于是将“右上角
子棋盘”的“
”(这个坐标是相对于该
子棋盘而言的,后面的描述也类似)和“右下角
子棋盘”的“
”和“左下角
子棋盘”的“
”设置(覆盖)为新的特殊方格,如图1-2:
图1-2
为什么要设置这种新的特殊方格呢?其实是为“递归覆盖”服务的。可以发现这三个新的特殊方格刚好对应于骨牌(称为缺左上骨牌):
设置这三个新的特殊方格相当于用缺左上骨牌覆盖了棋盘的相应位置。
(3) 接下来对4个子棋盘各自进行覆盖操作,就是“将本问题分解为4个子问题,再分别解决这4个子问题,解决完后,本问题就解决”,这正体现了分治思想。子问题和本问题是同一类型的不同输入规模的问题,如果用户当初输入的k值为2而不是3,那么需要覆盖操作的自然就是
棋盘了,正对应于上述的
子棋盘,只是假设用户对每个
棋盘输入的特殊方格的坐标分别为
罢了(注意是用户输入!)
(4) 解决对左上角子棋盘进行覆盖操作这个子问题时,同样需要再将该子棋盘均等分为4个
的子子棋盘,由于特殊方格
位于右上角
子子棋盘中,所以将“左上角2×2
子子棋盘”的“
”(这个坐标是相对于该
子棋盘而言的,后面的描述也类似)和“右下角
子子棋盘”的“
”和“左下角子
子棋盘”的“
”设置(覆盖)为新的特殊方格,如图1-3:
图1-3
可以发现这三个新的特殊方格刚好对应于骨牌(称为缺右上骨牌):
(5) 解决对右上角子子棋盘进行覆盖操作这个子子问题时,同样需要再将该子棋盘均等分为4个
的子子子棋盘,这时每个子子子棋盘就是一个方格。由于特殊方格
位于左下角方格,所以将左上角方格和右上角方格和右下角方格设置(覆盖)为新的特殊方格,如图1-4:
图1-4
可以发现这三个新的特殊方格刚好对应于骨牌(称为缺左下骨牌):
(6) 解决了所有的子子问题,就相当于解决了所有的子问题,就相当于解决了本问题,于是,棋盘覆盖问题迎刃而解,主要使用了分治思想。
④ 接下来就是根据上述解决问题的过程来编写程序,使用递归函数(Java中称为递归方法)是必不可少的。编写程序的过程不在这里描述,程序中已包含详细清晰的注释。
我认为我的程序比较冗余,不拿出来贻笑大方了,建议读者自己写写,如果真的想要俺的Java代码,可以给我发消息。
3、实现方式:
使用Java语言,在Intellij Idea上实现了该问题的解决。
4、测试运行结果:
本程序设有输入检查,在这里不演示。
棋盘覆盖问题(保姆级解释)相关推荐
- 路径、连通、连通图,强连通图、连通分量、极大连通子图以及割点、割边保姆级解释
前言: 由于在学习最大割的过程中涉及很多定义,下面先回顾一下关于路径.连通.连通图,强连通图.连通分量.极大连通子图以及割点.割边的定义 目录 1.路径 2.连通 3.连通图 4.强连通图 5.连通分 ...
- 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解
动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...
- 这可能是东半球最保姆级的后台服务器开发学习路线
作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...
- 快速上手Springboot项目(登录注册保姆级教程)
本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...
- 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线
前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...
- 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)
本文大纲: 因内容较多,带目录的PDF查看是比较方便的,点击下方链接获取完整PDF版: 数仓建设保姆级教程PDF文档 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先 ...
- 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下
文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...
- GOES-16数据下载(保姆级教程)
GOES-16数据下载(保姆级教程) 先上GOES-16数据下载的网址link 1.先进入上述网址,下拉选项可以选择想要下载的数据,这里我选择的是辐亮度数据. 2.选择想要的数据的日期,最多只能选择3 ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)...
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
最新文章
- HashMap的getOrDefault()方法
- 表 合并字段_多工作表动态合并,其实很简单
- C++求数组子数组和的最大值并将该子数组和最大值打印出来
- .idl与.odl的区别
- 【转】1.DThread、ThreadPool、Task、Parallel的基本用法、区别以及弊端
- 诺奖奖金为何119年还没发完?
- mysql更改安装路径6_关于mysql安装后更改数据库路径方法-Centos6环境
- C#注册类方法到Lua
- 【转】flash不建议设置wmode及wmode解释
- 如何防止输入同样的编号到数据库中(30分)
- 什么是对象存储OSS,看完你就懂了
- 转:隐马尔可夫模型(HMM)攻略
- 杰理之无线MIC【篇】
- 使用奇东锐腾PXE网克工具进行批量装机和系统恢复
- c#物联网_毕业季我与你招聘信息中移物联网
- 如何启用计算机网络共享,无法启用共享访问,教您无法启用共享访问怎么解决...
- VS2010 msdn 下载 安装
- 计算机提示无法访问手机tf卡,内存卡在电脑上无法显示
- 服务器系统安装提示无法创建新的系统分区,安装win7旗舰版系统时提示“安装程序无法创建新的系统分区”怎么解决...
- 基金使用计划 数学建模 matlab,基金使用计划(数学建模).ppt