[Алгоритм] генерация случайной квадратной 2D карты из N стран

Не могу придумать алгоритм генерации случайной квадратной 2D карты из N стран таким образом, чтобы площадь каждой страны была одинаковой.

Допустим, есть карта 100 х 100 - двухмерный массив. Есть 10 стран - от 0 до 9. Когда-то ячейка на карте не занята, она равна -1. Нужно сделать так, чтобы территория была поделена между всеми странами равным образом. Территория должна быть цельной, то есть страна не может состоять из двух кусков не соединенных друг с другом. При каждой генерации результат должен быть немного разным (по внешнему виду, то есть форма стран каждый раз разная).

Я начал делать следующим образом:
1) для каждой страны выбрал точку в различных частях карты
2) потом для каждой страны, отталкиваясь от начальной точки, ищу соседние свободные точки и присоединяю их к территории страны.
3) и так пока все страны не наберут равную территорию

Проблема в том, что из-за случайности выбора точки и направления присоединения иногда получается что одна страна блокирует доступ другой стране к незанятым соседним точкам. И тогда всё - бесконечный цикл. Так как блокирующая страна набрала территорию, а блокируемая нет, но и точек она достичь не может.

Поэтому две просьбы:
1) если знаете название алгоритма решающего эту проблему, напишите пожалуйста.
2) если есть идеи как решить проблему, тоже напишите.
  • Вопрос задан
  • 4557 просмотров
Пригласить эксперта
Ответы на вопрос 3
@business-gl
Интересная задачка, если решать в лоб, то может быть требовательна к ресурсам.
Можно к вашему алгоритму добавить:

1) Очередь подбора следующей клетки (скорее всего уже есть)
2) Возможность перевыборов клетки (выбрал, но она занята, скажи тому у кого отхватил, что он может выбрать вне очереди)

Вообще задача может быть интересна и с точки зрения математики, Так как можно так подобрать первоначальное расположение игроков, что выбрать все одинаковою территорию не получится.

Самым оптимальным мне кажется предложение @wyfinger о выходе из центра карты к краям.
Потом можно предложить остальным совершить N число обменов с соседями, по каким-то правилам. Этот способ съест конечное рассчитываемое число ресурсов и при этом можно задавать какие-либо правила обмена (стремиться к центру или краю итд)
Ответ написан
xanep
@xanep
1. Считаем какой должна быть площадь стран - размер_карты / количество_стран, или заданный заранее.
2. Выбираем случайную точку на карте из незанятых, присоединяем к ней случайным образом соседние, пока не будет нужный размер страны (посчитанный в 1.)
3. N раз повторяем пункт 2.
Ответ написан
ntkt
@ntkt
Потомственный рыцарь клавиатуры и паяльника
Вспомните формулу Пика (площадь многоугольника на плоскости, чьи вершины лежат в узлах координатной сетки). Вот подборка задачек для разминки: zaba.ru/cgi-bin/tasks.cgi?tour=books.sms700.fpika&solution=1
Исходя из формулы Пика формулируем инвариант (площадь любых двух стран в любой момент времени равна). Любое преобразование границ должно сохранять инвариант. Начальное разбиение строим случайным образом, исходя из максимальной или минимальной возможной длины границ между странами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы