递归特训:棋盘覆盖问题

本文介绍了如何运用递归和分治算法解决棋盘覆盖问题。通过对2^k * 2^k棋盘的四部分进行处理,每次选择一个子区域的非特殊方格作为新的特殊点,直到子区域只剩一个方格时结束递归。通过这种方法,实现了除特定点外的棋盘全面覆盖。
摘要由CSDN通过智能技术生成

解题思路:这一题使用递归的解法比较便于理解,这里可以采用前面使用过的分治算法,将整个棋盘分成四个部分。直接划分后只有一个部分会有黑色图块,而其余三个部分则都是白色图块。这里可以采取人为添加的方式。在其余三个部分增加一个骨牌覆盖到三个部分,这样每个区块又都会包含黑色图块,然后分部分继续求解。递归的返回条件则是划分的图块只有一块时,直接返回即可。注意学习题目的递归思想。

题目大意:

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

建立模型如图:

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

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

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

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

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

#include<cstdio>
#includ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值