据说这是真的竞赛题…

哈喽各位亲爱的观众朋友们大家好!没错,还是我。这次我终于做到了史无前例的一周一更。

今天的题目和上期一样,有那么亿些些难度。但实质上DFS用熟了还是可以解决的。代码有些长,可能也不是最优解法。但是总体运行时间尚可接受。让我们点开下面的音乐,开启今天的内容吧!


今天我们来研究一个神奇的填色块机器:

这个题目考点还是不少的。首先,输入的格式是一个坐标系的点图。但是众所周知我们二维数组模拟的更像是一个个方格组成的方块图。将点对点的输入数据描述转化成C++能接受的二维数组,是我们必须要克服的问题。
在简单的实验后,我发现我们可以将输入的右下角X ,Y坐标各减去1,配合前面的左上角数据就能够确定该矩形左上角和右下角的方块在数组中的方位。将“坐标系”转化为“方格系”,这是我处理数据的基础。

相比于最关键而且陷阱很多的DFS函数,这样的问题简直就不叫问题。与DNDS吉尼斯不同,对于这段程序而言,完成了输入后我们不需要在数据前面加上过多的处理。现在,我们就要进入最关键的深度优先搜索环节了。
具体的解决方案如下:




在深度优先搜索的函数里,我将工作大致分成了一下几步:
将输入的平板和喷涂色块的记录(used[30])都从输入里复制下来。然后用复制本进行操作。这样做是因为据我实践发现,如果直接用函数里面int 的数据的话,到最后那个数组实际上就是个指针。这样一来将数组开在函数括号里和开在括号外当整体的数组就没啥实质区别了,而且回溯也相当麻烦。
设置一个终结的状态,也就是将步数返回到ans里,将答案值更新。这里我的终结条件是我们填涂完的矩形数量等于输入的矩形数量
其他情况:继续搜索。这里是全程序最大的难点。最外面的for循环目的是让整个寻找+填涂环节进行4次。这个是我为了应对特殊情况专门多写的。就像在输入的数据里,如果我们将示例输入的第一个和第三个矩形描述调换一下,我的程序就有些危险了。然后就是循环选择矩形。再往里是一个if做的基本判断,主要检查方块的预定颜色是否匹配,以及该方块是否已经被填涂。再往里是一层循环,检查选定的矩形是否全部被涂满,这里会反馈一个叫“ok”的布尔型数据,这是我们决定填涂方块的最后指标。接着就是涂色以及计数的环节。如果本次搜索加循环有成果,那么就可以进入下一轮搜索,否则这个搜索支就此终结。
完成了一系列的循环搜索后,输出答案,程序结束。

好啦,这一期的竞赛题目就写到这里啦。既然都看到这里了,记得一键三连哦!由于BNDSOJ上的数据比较弱,本期UP决定,如果点赞数量超过4个,或者阅读量达到30,我就把这个程序放到洛谷上用加强的数据测评一下,下期公布截图!
Ps:由于题目可能是某个竞赛的原题,我就暂时不勾选原创了

