•
问题描述:
残缺棋盘是一个有2k×2k(k≥1)个方格的棋盘,其中恰有一个方格残缺。如图给出k=1时各种可能的残缺棋盘,其中残缺的方格用阴影表示。

• 残缺棋盘问题就是要用这四种三格板覆盖更大的残缺棋盘。在此覆盖中要求:
1)两个三格板不能重叠
2)三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。
小格子数(2k×2k -1)三格板中小格子数3。所以所需要的三格板总数为(2k×2k
-1 )/3。
•
例如,一个4*4的残缺棋盘2k*2k

以k=2时的问题为例,用二分法进行分解,得到的四个k=1的棋盘。但要注意这四个棋盘,并不都是与原问题相似且独立的子问题。
因为当如图中的残缺方格在左上部时,第1个子问题与原问题相似,而右上角、左下角和右下角三个子棋盘(也就是图中标识为2、3、4号子棋盘),并不是原问题的相似子问题,自然也就不能独立求解了。当使用一个①号三格板覆盖2、3、4号三个子棋盘的各一个方格后,我们把覆盖后的方格,也看作是残缺方格(称为“伪”残缺方格),这时的2、3、4号子问题就是独立且与原问题相似的子问题了。
•
问题分析
从以上例子还可以发现
当残缺方格在第1个子棋盘,用①号三格板覆盖其余三个子棋盘的交界方格,可以使另外三个子棋盘转化为独立子问题;
当残缺方格在第2个子棋盘时,则首先用②号三格板进行棋盘覆盖
当残缺方格在第3个子棋盘时,则首先用③号三格板进行棋盘覆盖
当残缺方格在第4个子棋盘时,则首先用④号三格板进行棋盘覆盖,这样就使另外三个子棋盘转化为独立子问题。

程序代码思路:
表示方法:每个三格板需要用同一个数字表示,不同三格板编号不同。
源码:

分治递归执行步骤:
1)chessBoard(0, 0, 0, 0, 4);
{ t=1; s=2;
chessBoard(0, 0, 0, 0, 2);
{ t=2; s=1;
chessBoard(0, 0, 0, 0, 1);
{ s==1
return
}
以下三步
将左上角 三格板 用t=2覆盖
}
return
以下三步 对右上递归 先 用t=1 覆盖左下
左下递归 先 用t=1 覆盖右上
右下递归 先 用t=1 覆盖左上
递归处理类似。
}
分享到:
相关推荐
用分而治之方法可以很好地解决残缺棋盘问题。
使用JAVA解决残缺棋盘覆盖问题:一个n*n的棋盘上有一个缺陷点,该点不能被覆盖,剩下的格子全部用三盒板覆盖。应用的是分治法。
本文主要介绍了Java基于分治算法实现的棋盘覆盖问题,简单描述了棋盘覆盖问题,并结合具体实例形式分析了Java基于分治算法实现棋盘覆盖问题的相关操作技巧。 知识点一:分治算法的基本概念 分治算法是一种将复杂...
总结来说,残缺棋盘问题是一个有趣的组合优化问题,通过C语言和回溯算法可以有效地求解。解决这个问题不仅可以提升编程技巧,还能加深对图论和回溯策略的理解。如果你对这个话题感兴趣,可以尝试编写代码并调试,以...
残缺棋盘问题是一个经典的计算机科学问题,通常与汉诺塔或八皇后问题等一起被用来教授分治法。在这种问题中,我们需要确定在一个8x8的棋盘上,如果只有一个方块缺失,如何快速地定位到这个缺失的方块。通过递归地...
### 棋盘覆盖算法(分治算法) #### 背景与定义 在计算机科学领域,特别是算法设计中,“棋盘覆盖”问题是一个经典的题目,它涉及到如何使用特定形状的多米诺骨牌(通常为 L 形)来覆盖一个有缺陷的棋盘。这里所谓的...
在本案例中,我们将探讨如何使用分治法解决“残缺棋盘”问题。 残缺棋盘问题通常指的是在一个n×n的棋盘上,某些格子被移除,我们要求在剩余的格子中放置皇后,使得任意两个皇后都无法互相攻击,即不存在行、列或对...
算法分析与设计 课程中分治策略的典型例子,采用MFC文档编程可视化实现算法; 能够手动进行对棋盘的颜色填充,并能显示棋盘中的填充数值。 由于这是课程作业,时间紧而赶制的,封装性可能比较差。 我用的版本是C++...
在这个压缩包文件中,我们关注的是五个核心的算法概念:动态规划、分治算法、算法排序、贪心算法,以及这些算法在实际问题中的应用,特别是分治算法在树的路径问题中的应用。下面,我们将深入探讨每一个算法,并尝试...
分治算法的基本思想是将大问题分解为若干个规模较小的相同或相似的子问题,再将这些子问题的解合并,最终得到原问题的解。在棋盘覆盖问题中,我们将棋盘不断划分为4个大小相同的子棋盘,直到子棋盘的大小为1,即只...
**残缺棋盘设计报告** ...总结,残缺棋盘设计报告涵盖了从问题定义、算法设计、数据结构实现到编程实现的全过程,展示了如何在实际项目中运用计算机科学原理和技术,以满足用户需求并提供有趣的游戏体验。
残缺棋盘覆盖仿真,功能包括 (1)自定义棋盘大小 (2)随机产生残缺块位置 (3)用4种不同颜色标识不同的三角板 (4)自动给出覆盖过程(速度可调) (5)对各种三角板进行自动计数
【VC++残缺棋盘(MFC)】是一个基于Microsoft Foundation Classes (MFC)库的编程项目,它展示了如何使用C++和MFC来创建一个交互式的图形用户界面,用于模拟和解决残缺棋盘问题。残缺棋盘问题是一个经典的计算机科学...
在IT领域,尤其是在软件开发中,经常会遇到各种挑战性的问题,比如“残缺棋盘”问题。这是一个典型的逻辑和算法问题,通常与游戏设计、计算机科学教育或算法竞赛相关。本话题将深入探讨如何利用MFC(Microsoft ...
总的来说,解决残缺棋盘游戏问题需要对算法设计有深刻的理解,尤其是分治法的应用,同时需要掌握有效的回溯搜索技巧,以便在保证覆盖完整的同时避免板块的重叠。这个问题的解决方案不仅能锻炼编程能力,也能提升对...
- **残缺棋盘**:例如汉诺塔问题,可通过分治策略解决。 - **排序**:快速排序和归并排序都是典型的分治算法。 - **选择**:寻找第k小的元素,可以采用分治策略。 - **计算几何**:如最近点对问题,可以使用分治...
总结来说,"二重指针求残缺棋盘"是一个涉及高级编程技巧和算法设计的问题,它要求开发者巧妙地利用二重指针进行高效遍历,同时避免全局变量的使用,以优化算法的时间性能。在实际编程中,这样的问题需要深入理解数据...
在编程领域,残缺棋盘问题是一个经典的计算机科学问题,它通常用来展示递归和分治算法的应用。在这个问题中,我们假设有一个8x8的国际象棋棋盘,但某些方格被移除了(即“残缺”)。任务是计算在给定条件下,能够...
### JAVA 实现棋盘覆盖问题 #### 知识点概览 ...通过上述分析可以看出,该程序成功实现了棋盘覆盖问题的解决方案,并利用了分治法的思想,借助Java语言的基础语法完成了一个实用而有趣的递归算法实现。
残缺棋盘覆盖问题作为计算机算法教学中的一个经典案例,经常被用来阐释分治策略的精髓。为了使这一概念更易为公众所理解,一款名为“残缺棋盘覆盖仿真模拟软件源码”的Java桌面应用程序被开发出来,它不仅提供了算法...