我正在为以下问题寻找算法(最好是多项式):
输入:
- 一个M×N网格,每个方格可以是空的或占用的
- 项目清单
- 约束列表
输出:
网格,以便放置所有项目并且不违反约束。
每个项目是长度为k的1d块。不同的物品可能具有不同的长度,并且可能存在具有相同长度的若干物品。物品不能相互叠加。
示例1: 给定1 x 5网格和2项长度1,2。以下解决方案是可以接受的:
11100
10110
11010
等等。
示例2: 给定3 x 5网格和2项长度1,2。以下解决方案是可以接受的:
00110
10000个
00000
11000
10000个
00000
等
可能的限制:
一个。隔离 - 物品可能不会相互接触。例如以下解决方案是非法的:
示例1:
11100
示例2:
11000
10000个
00000
然而,这是一个合法的解决方案:
01100
10000个
00000
即。触摸对角线是合法的。
湾面对 - 2个项目必须一个放在另一个之前。 e.g。
11000
00000
11000
到目前为止,我所做的是找到一个更简单问题的解决方案,其中网格是1d,唯一可能的约束是隔离。我通过将其表示为搜索问题来解决它,并使用带有启发式的A *:未放置的项目长度的总和。问题是它遭受状态爆炸,只会在更高的维度上恶化。