二维精确覆盖问题
题目
https://zoj.pintia.cn/problem-sets/91827364500/problems/91827367871
题意
给出p个小矩形和每个小矩形的左下角、右上角坐标,问能否用这些小矩形拼成一个m×n的大矩形,拼接的时候小矩形的位置不能改变,且小矩形之间不能重叠。
题目解析
这是一个二维的精确覆盖问题,可以转化为一维来处理。对于每一个小矩形,将其能覆盖的区域赋值为1,不能覆盖的区域赋值为0,这样就构建了一个m×n的矩阵,然后将这个二维的矩阵转化为一维的向量。转化的方法就是,把矩阵的m行元素按顺利排一行,比如矩阵的第一行的第1、2、…、n-1、n个元素的作为向量的第1、2、…、n-1、n个元素,第二行的第1、2、…、n-1、n个元素作为向量的第n+1、n+2、….、2n-1、2n个元素,第i行的第j个元素的作为第i×n+j元素。接下来将p个小矩形转化成的p个向量组成一个p行m×n列的的矩阵,这样题目就转化为对这个矩阵求标准的精确覆盖问题,用舞蹈链算法处理一下就好了。
需要注意的是,这题需要求覆盖整个大矩形,最少使用的小矩形,求出可行解后需要继续搜索出最优解。
代码
1 | /* https://zoj.pintia.cn/problem-sets/91827364500/problems/91827367871 */ |