По-моему ответ на вопрос будет зависеть от цели такой упаковки.
Для runtime'а вполне можно использовать и "раскрытый" массив, он ведь небольшой. А если цель в достижении минимального размера и не предполагается runtime доступ и изменения без распаковки - я бы смотрел на вариант упаковки с сохранением не поля, а кораблей - максимально получается по 10 бит на корабль:
- 7 бит позиции
- 2 бита на тип корабля
- 1 бит ориентации (для "однопалубных" можно пропустить)
Думаю что можно ещё больше оптимизировать если хранить не абсолютный отступ, а относительный от предыдущего, тогда скорее всего можно будет "влезть" в байт на корабль и 10 байт в сумме.