Ввёл у группы понятие "минимально возможное кол-во мин" и "максимально возможное кол-во мин". При первоначальном создании групп заполняем одинаковым значением.
Переделал логику обработки пересечения групп, обобщив ее, тем самым избавившись от отдельного кейса "группа содержит группу". Из двух пересекающихся групп A и B создаем от одной до трех новых групп (но не плодя дубликаты), при этом старые группы не удаляем (это важно, но приходится запоминать кого с кем уже пересекали, чтобы повторно в будущем не пересекать):
A = {cells: ..., min: ..., max: ...}; // Массив ячеек, минимальное кол-во мин, максимальное кол-во мин B = {cells: ..., min: ..., max: ...};
Добавляем новую группу C = { cells: A.cells.getOverlap(B.cells), // Пересечение массивов ячеек min: m0, max: M0 }, где m0 и M0 считаем так:
Если разность массивов ячеек A минус B не пуста, добавляем группу D = { cells: A.cells.getSubtraction(B.cells), min: m1, max: M1 }, где m1 и M2 считаем так:
Ну и соответственно если разность массивов ячеек B минус A не пуста, по аналогии добавляем группу E.
Также важно, при совпадении массива ячеек у двух групп удаляем не рандомную группу, а ту у которой min меньше и max больше, одновременно, иначе не удаляем никакую.
Неправильно работает алгоритм по обработке пересечений групп.
Вот как решил алгоритм следующую ситуацию:
Он произвел помимо прочего такие преобразования: (1273654, 3) - (1, 1) -> (273654, 2) (273654, 2) X (87, 1) -> (7, 1), (23654, 1), (8, 0) что вполне соответствует алгоритму, но очевидно неправильно.
Возможно просто какой-то нюанс преобразований автор в статье забыл упомянуть, но я не могу понять как исправить.
Настоящая стратегия с большой буквы С — Supreme Commander, игра, в которой мало что зависит от твоего APM, а нужно думать именно стратегически, по сравнению с ней Старкрафт — вообще не стратегия, а аркада, и это я говорю как человек, который обожает серию Старкрафта и не фанат Supreme Commander'а
Вопрос закономерный. В некоторых ситуациях допускаем такую вольность. Согласен, возможно и зря, но, согласитесь, это не делает эту уязвимость более оправданной.
Вместо Ctrl + E использую Ctrl + X для вырезания текущей строки, еще Shift + F4 удобно — выводит окошко со списком открытых файлов, можно пачками закрывать ненужные.
Доработал идею с группами.
Ввёл у группы понятие "минимально возможное кол-во мин" и "максимально возможное кол-во мин". При первоначальном создании групп заполняем одинаковым значением.
Переделал логику обработки пересечения групп, обобщив ее, тем самым избавившись от отдельного кейса "группа содержит группу". Из двух пересекающихся групп A и B создаем от одной до трех новых групп (но не плодя дубликаты), при этом старые группы не удаляем (это важно, но приходится запоминать кого с кем уже пересекали, чтобы повторно в будущем не пересекать):
A = {cells: ..., min: ..., max: ...}; // Массив ячеек, минимальное кол-во мин, максимальное кол-во мин
B = {cells: ..., min: ..., max: ...};
Добавляем новую группу C = {
cells: A.cells.getOverlap(B.cells), // Пересечение массивов ячеек
min: m0,
max: M0
}, где m0 и M0 считаем так:
m0a = min(max(A.min - (A.size - C.size), 0), C.size);
M0a = min(max(A.max, 0), C.size);
m0b = min(max(B.min - (B.size - C.size), 0), C.size);
M0b = min(max(B.max, 0), C.size);
m0 = max(m0a, m0b);
M0 = min(M0a, M0b);
Если разность массивов ячеек A минус B не пуста, добавляем группу D = {
cells: A.cells.getSubtraction(B.cells),
min: m1,
max: M1
}, где m1 и M2 считаем так:
m1 = min(max(A.min - C.max, 0), D.size);
M1 = min(max(A.max - C.min, 0), D.size);
Ну и соответственно если разность массивов ячеек B минус A не пуста, по аналогии добавляем группу E.
Также важно, при совпадении массива ячеек у двух групп удаляем не рандомную группу, а ту у которой min меньше и max больше, одновременно, иначе не удаляем никакую.
Неправильно работает алгоритм по обработке пересечений групп.
Вот как решил алгоритм следующую ситуацию:
Он произвел помимо прочего такие преобразования:
(1273654, 3) - (1, 1) -> (273654, 2)
(273654, 2) X (87, 1) -> (7, 1), (23654, 1), (8, 0)
что вполне соответствует алгоритму, но очевидно неправильно.
Возможно просто какой-то нюанс преобразований автор в статье забыл упомянуть, но я не могу понять как исправить.
Но:
Почему так? PHP 5.5.9
«хочу поделится» -> «хочу поделитЬся»