Как стать автором
Обновить
2
0

Пользователь

Отправить сообщение

Доработал идею с группами.

Ввёл у группы понятие "минимально возможное кол-во мин" и "максимально возможное кол-во мин". При первоначальном создании групп заполняем одинаковым значением.

Переделал логику обработки пересечения групп, обобщив ее, тем самым избавившись от отдельного кейса "группа содержит группу". Из двух пересекающихся групп 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)
что вполне соответствует алгоритму, но очевидно неправильно.

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

Настоящая стратегия с большой буквы С — Supreme Commander, игра, в которой мало что зависит от твоего APM, а нужно думать именно стратегически, по сравнению с ней Старкрафт — вообще не стратегия, а аркада, и это я говорю как человек, который обожает серию Старкрафта и не фанат Supreme Commander'а
Немного изменил пример с инкрементацией, получилось странно:

		$a = 1;
		var_dump ($a + ($a = 2));

		int 4 - все верно


		$a = 1;
		var_dump ($a + $a + ($a = 2));

		ErrorException [ Fatal Error ]: Unsupported operand types


Но:
		$a = 1;
		if (($a + $a + ($a = 2)) == 2)
			echo '==';

		==


Почему так? PHP 5.5.9
Спасибо за статью!
«хочу поделится» -> «хочу поделитЬся»
Вопрос закономерный. В некоторых ситуациях допускаем такую вольность. Согласен, возможно и зря, но, согласитесь, это не делает эту уязвимость более оправданной.
Вместо Ctrl + E использую Ctrl + X для вырезания текущей строки, еще Shift + F4 удобно — выводит окошко со списком открытых файлов, можно пачками закрывать ненужные.

Информация

В рейтинге
Не участвует
Откуда
Владивосток, Приморский край, Россия
Дата рождения
Зарегистрирован
Активность