船が重なったり、接触したり (斜めであっても) できないというルールに従って、多数の船をボードに配置するためのアルゴリズムの構築についてアドバイスが必要です。ランダムな位置を選択した後、残りの船に十分なスペースを確保するにはどうすればよいですか?
たとえば、6x6 ボード (2D 配列) に 5 隻の船を合わせたいとします。船のサイズは : 5、4、3、1、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 に配置する関数をどのように実装しますか?