我需要一些关于根据船舶不能重叠或接触(甚至对角线)的规则构建一种算法以将许多船舶放置在板上的建议。在随机选择一个位置后,我怎样才能确保我仍然有足够的空间容纳其他船只?
例如,我想在 6x6 板上(二维阵列)上安装 5 艘船。船的尺寸是:5、4、3、1、1。有几种排列方式,如下所示:
-------------
| 1 1 1 1 1 . |
| . . . . . . |
| 2 2 2 2 . 4 |
| . . . . . . |
| 3 3 3 . . 5 |
| . . . . . . |
-------------
随机算法如下所示:
1. Get next ship
2. Get random cell and orientation
3. Try to fit ship (find any conflicts)
3a. If ship cannot fit, try different
cell and orientation, untill all cells
have been tried (function fails)
3b. If ship fits, get another ship (goto 1)
但是如果我使用它,我很可能会像这样结束(编辑:更改为在步骤 0 中按大小对船舶进行排序):
-------------
| . 3 3 3 . 4 | 5
| . . . . . . |
| . 2 2 2 2 . |
| . . . . . . |
| 1 1 1 1 1 . |
| . . . . . . |
-------------
意味着 1 格大小的船没有地方。我怎样才能避免这样的问题?我将如何实现一个verifyRestShipsWillFit()
放置在 3b 中的功能?