生成板上一组件的所有可能排列

时间:2016-10-30 10:21:38

标签: algorithm

我想知道在具有以下限制的战舰游戏中产生所有可能的放置组合的最佳方法是什么: - 电路板有R行和C列 - 在船上应该放置一套L船 - 每艘船的尺寸(他们将在板上使用的槽数) - 船舶可以水平或垂直放置在船上 - 2艘船不能重叠

例如,考虑一个10x10板和一组5艘船:

  • L1:5个插槽
  • L2:3个插槽
  • L3:3个插槽
  • L4:3个插槽
  • L5:2个插槽

如何生成一组所有可能的板布局。

感谢您的意见。

1 个答案:

答案 0 :(得分:1)

考虑到你想要列举安排而不是计算它们,并且安排的数量是指板的大小呈指数级,而且在传统游戏中船只的数量很少,你不能只做粗野 - 通过尝试将每艘船放置在适合和反向跟踪的每个可能位置来强迫它。

如果你有很多船只,就像你的董事会差不多满了,或者你只想计算安排的数量,那么你可以尝试使用ZDD来获得指数级提升(虽然运行时间可能仍然呈指数级)。

编辑:为了有效地处理相同规模的船舶,您必须考虑它们的多样性。即首先将船划分为&#34的向量u[i];我们拥有的i有多少船只":

  • 如果你循环遍历单元格,那么你保持一个&#34的向量v[i];已经放置了多少i形式的船只&#34;。对于每个单元格,您尝试放置i iff v[i] < u[i]形式的发货,如果它适合,则递增v[i]并递归到下一个单元格。

  • 如果你在船上循环,然后在某个单元格中放置i形式的船只,那么你只能将其他相同形式的船只放在&#39;之后的单元格中。 ;已放置的那个单元格。当所有形式为i的船舶已放置在纸板上时,您将移动到从单元格零开始下一个表格。