题解:P3148 [USACO16OPEN] Bull in a China Shop P
题号这么小的黑题还没有题解,我给完善一下。
一个想法是枚举三块拼图和他们的旋转角度、是否翻转以及坐标,这样的复杂度是
要优化这个算法,我们有以下方法:
- 定义一块拼图的左上坐标为其最左边的有颜色的单元格坐标,若有多个取最上面的坐标。若已知原拼图的左上坐标来自第
i 块拼图,则该位置来自第i 块拼图的左上坐标; - 使用哈希快速判断两块拼图是否相等。
第一个优化使得枚举前两块拼图时无需枚举其位置,第二个优化使得枚举第三块拼图时可以
如果
- 枚举所有的
x, y, z ,先判断一下这三块拼图是否在颜色个数和上和原拼图相等,这样可以筛出一些二元组(i, j) ,保证i, j 同时存在的拼法一定非法。这样O(K ^ 2) 就跑不满了; - 对一块拼图,先枚举其
8 中不同的方向,如果其中有相同的,后面就不枚举它,这样8 倍常数也跑不满; - 对一块拼图,先计算出其左上坐标,判合法的时候就无需再算一次了,这样
O(N^2) 带的常数变小。
这三个剪枝不容易同时卡掉至少两个(或者说数据没卡),可以通过。