Cell: struct {
x,y, height, width: float/double/int/bool (про bool пошутил)
neighbors: list of cell;
isLeftRed, isRightRed, itTopRed, isBottomRed: bool;
}
Каждая ячейка хранит инфу о своем положении, ссылки на соседей и набор параметров указывающих на допустимость пересечения конкретной границы (на примере не нарисовано, и я надеюсь, что нет случаев когда для какой-то ячейки одна из границ может быть пересекаемой только в конкретном положении).
По такой структуре можно легко и быстро определять куда можно ходить, куда нельзя. Не сложно оптимизировать структуру для меншего потребления ОП сжав все параметры в некий набор байт.
И тогда может очень большая карта влезет в 10 мб, что, я верю, достаточный результат.