这可是保姆级解释哦!

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. 路径、连通、连通图,强连通图、连通分量、极大连通子图以及割点、割边保姆级解释

    前言: 由于在学习最大割的过程中涉及很多定义,下面先回顾一下关于路径.连通.连通图,强连通图.连通分量.极大连通子图以及割点.割边的定义 目录 1.路径 2.连通 3.连通图 4.强连通图 5.连通分 ...

  2. 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解

    动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...

  3. 这可能是东半球最保姆级的后台服务器开发学习路线

    作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...

  4. 快速上手Springboot项目(登录注册保姆级教程)

    本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...

  5. 万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线

    前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这篇文章会有点长有点干,可以先去冲杯咖啡,慢慢看~ 正文 | 干货 |收藏 一.后端/后台/服务器开发? 经常在各大公司招聘 ...

  6. 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)

    本文大纲: 因内容较多,带目录的PDF查看是比较方便的,点击下方链接获取完整PDF版: 数仓建设保姆级教程PDF文档 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先 ...

  7. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

    文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...

  8. GOES-16数据下载(保姆级教程)

    GOES-16数据下载(保姆级教程) 先上GOES-16数据下载的网址link 1.先进入上述网址,下拉选项可以选择想要下载的数据,这里我选择的是辐亮度数据. 2.选择想要的数据的日期,最多只能选择3 ...

  9. 保姆级教程——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版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

最新文章

  1. 2015上半年软件设计师考点,难点3
  2. Android内容提供程序
  3. http如何像tcp一样实时的收消息?
  4. Winform自动更新组件分享
  5. Linux_09 Linux软件包管理 rpm与yum
  6. SAP 电商云 Spartacus Schematics 开发环境搭建
  7. apache camel_REST与Apache Camel
  8. 我最喜欢的IntelliJ IDEA功能
  9. C++中拷贝构造函数
  10. GARFIELD@01-13-2005
  11. python任意输入一个正整数、判断该数是否为素数_Python编程判断一个正整数是否为素数的方法...
  12. setInterval 和$interval的区别
  13. Redis Lua脚本
  14. 软件工程人才的社会需求现状与发展分析
  15. Java 简单图片 马赛克,黑白画,珠纹化,油画效果等处理技术 原理及实现 (简单UI)
  16. java页面数值转文本_Java读取Excel表格以及读取数字列转为文本的解决办法
  17. 细节:如何轻松影响他人
  18. Rancher 2.2 GA:企业进入应用跨多K8S集群、混合云部署新时代
  19. 淘宝新自动化测试框架AutoRobot简要介绍
  20. POJ 1647 One-move checkmate G++

热门文章

  1. 基于dejavu的音频识别
  2. 2018idea下载不了插件解决方法(以lombok为例)
  3. win10子系统ubuntu(WSL) 安装Docker
  4. 传智播客的java培训结束了,我的爱也结束了
  5. krpano 连接符、赋值、取值、复制
  6. 使CPU利用率跑高的脚本致使服务器死机
  7. 星光2开发板使用ECR6600U无线wifi网卡的方法
  8. 二分查找O(logn)和归并排序O(nlogn)时间复杂度介绍
  9. python 拼多多_8.05拼多多编程题(python)
  10. Python+大数据-知行教育(七)-学生出勤主题看板