8.3 递归与分治

本文探讨了递归与分治在解决棋盘覆盖、循环日程表和巨人与鬼问题中的应用。棋盘覆盖通过将大问题分解为小问题解决;循环日程表利用对角线对称性找到规律;巨人与鬼问题通过选择合适配对避免质子流交叉。这些例子展示了递归与分治在解决复杂问题时的有效性。
摘要由CSDN通过智能技术生成

8.3 递归与分治

这一章节主要介绍递归除了排序与检索以外,更为广泛的应用(实际上是介绍了递归与分治的使用情况与使用意义)。


棋盘覆盖问题

有一个2k*2k的方格棋盘,恰好有一个方格为黑色的,其他都为白色。你的任务是用包含3个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖,且任意一个白色方格不能同时被两个或更多牌覆盖。以下是L型牌的四种旋转方式:

在这里插入图片描述
分析:本题的棋盘是2k*2k的,如果使用分治法很容易想到将棋盘切割成4块。此时的四个2k-1*2k-1的方块中必有一个含有一个黑色方块,这个方块可以视作k-1的情况,其他的三个方块全都没有黑格子。我们可以通过下面的方式“构造”出一个黑格子:

在这里插入图片描述

图中的红格子为2k*2k的方格中原有的黑格子,我们取一个L型牌放置在2k*2k的方格中心,保证每一个2k-1*2k-1的区域中都有一个异色的方块。此时我们可以将k的问题分割k-1的四个子问题,假设棋盘为2k*2k的方格时,所放牌的个数为f(k),于是有f(k)=4*f(k-1)+1(1为放置在中间的一个L型牌),f(1)=1。

代码就不写了,因为知道了原理以后这个题就非常简单了。


循环日程表问题

n=2k个运动员进行网球循环赛,需要设计比赛日程表。每个选手必须与其他n-1个选手各赛一次。每个选手每天只能赛一次,循环赛一共进行了n-1天。需要按此要求设计一张比赛日程表,该表第i行第j列表示第i个选手第j天遇到的选手。

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 6 5
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 6 5 3 4 1 2
8 7 6 5 4 3 2 1

分析:网上实在是找不到画的好看的图嗷hhhhh。实际上这个问题和递归分治的关系并不大,属于一道找规律的数字方证题,我们仔细观察就可以发现将一个方证切割成四个部分,每个部分都是按照对角线对称,也就是说我们只需要定义第一行(从1-n),然后不停的找下面的规律就可以了。

代码就不写了,主要写了也是找规律,用不到分治的思想(它并没有分治中最重要的一步合并问题)。


巨人与鬼

一组n个巨人正与n个鬼进行战斗,每个巨人的武器是一个质子炮, 它可以把一串质子流射中鬼而把鬼消灭。质子流沿直线行进,在击中鬼时就终止。巨人决定采取下述策略。他们寻找鬼配对,以形成n个巨人─鬼对,。然后每个巨人同时向他选取的鬼射出一串质子流。我们知道,让质子流互相交叉是很危险的。因此巨人选择的配对方式应该使质子流都不会交叉。假定每个巨人和每个鬼的位置都是平面上的一个固定点,并且没有三个位置共线, 求一种配对方案。

分析:就是给你2*n个点,寻找一种两两配对的方式保证两两配对的点的连线不互相交叉。考虑到需要用分治法去解决这个问题,我们需要一种切割的方式将这个问题切割成多个子问题,下面提供一中分割的方式:

在这里插入图片描述
考虑所有点中处于最左下角的那个点,不妨设这个点为一个“鬼”(由于巨人和鬼是一一配对的关系,所以说设为巨人和鬼没有实际的区别)。此时其余的2n-1个点中,n-1个点为“鬼”,n个为巨人。我们只需要找到一个代表“巨人”的点进行连线,保证被这条连线所代表的直线分割出来的两部分中各含有的“鬼”和“巨人”的点的个数相等即可。

按照顺时针的顺序将其他点进行编号,如果第一个点为“巨人”,那配对完成。剩下的“巨人”和“鬼”一样多,而且并不会和这条线段交叉。如果这个点为“鬼”,也就是说当左下角的点与第二个点连线时,上半边的区域中“鬼”的个数比“巨人”多一个(“鬼”只有一个),然而由于最后一个点也需要为“鬼”(不然直接和最后一个点连线即可),当我们与倒数第二个点连线时,上半边的区域中,“鬼”的个数比“巨人”少(因为左下角的点和最后一个点全为“鬼”),但是我们每次检查完一个点,切割完整个图,再检查下一个点切割图时,上半边点的个数+1,也就是说“巨人”和“鬼”点的个数差变化了1。与第二个点连线时,“鬼”比“巨人”多,与倒数第二个点连线时,“巨人”比“鬼”多,那么在中间一定存在某个点,保证上半边和下半边“鬼”和“巨人”个数相等。

根据上面的分析,我们可以确定这种切割方式是一定存在的。由于不知道数据是什么形式提供的,这道题也只介绍思路不进行编写了。


这一章主要是对分治思想的介绍和探究,大家在练习时还是需要找一些难度适中的题目进行实际编写和训练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值