Продолжим.
Рассмотрим в качестве примера использования программы решение самой простой из интересных задач: какой минимальный размер куба в
нужно взять, чтобы на целочисленной решётке нашлось ОМ из 8 точек.
Я буду объяснять всё на примере программы, вложенной в
это сообщение. В программе по умолчанию рассмотрена целочисленная решётка (то бишь, при
delta равном 1) на кубе со стороной 10 (соответствует
).
Мы возьмём куб меньшего размера --
.
delta оставляем 1 (это целочисленная решётка, других пока рассматривать не будем). Чтобы перебрать все интересующие нас варианты 8-точечных множеств в этом кубе, мы должны для любой точки, соответствующей некоторому углу 3D-куба, задать Допустимое Множество (ДМ) для перебора по этой точке от угла до середины стороны по каждой координате. Скажем проще: каждая точка должна пробегать всю целочисленную решётку в своей осьмушке 3D-куба. Четвёртую координату будем пробегать полностью -- от 0 до 7.
Значит, для всех точек нужно задать ДМ от 0 до 3 включительно по первым трём координатам и от 0 до 7 по последней. Это делается так: создаём где-то в районе 250-й строки новые
dlist (в данном случае они есть, но если бы не было, мы бы их сделали так):
Код:
dlist g03={0, +delta, +2*delta, +3*delta};
dlist g30={0, -delta, -2*delta, -3*delta};
upd: Таким образом, мы задаём отклонение нашей угловой точки не более чем на 3 шага внутрь куба по каждой координате.
В блоке присвоения
deltas (строки в районе 260--270) заменяем
dlist на нужные (либо убеждаемся, что там стоят нужные):
Код:
for (int i=0; i<sol_size/2; i++) {
for (int j=0; j<D-1; j++) {
//if (i==0 || i==1) { deltas[i][j]=g00; }
//else {
switch (grid_base[i][j]) {
case 0:
deltas[i][j]=g03; break; // здесь для этой задачи должно быть g03
case L:
deltas[i][j]=g30; break; // здесь для этой задачи должно быть g30
default:
deltas[i][j]=g11;
}
Последнее по
default в данной задаче не будет задействовано, его можно проигнорировать.
Для перебора по четвёртой координате создаём там же
dlist gt (
-- это по имени координаты):
Код:
dlist gt={0,1,2,3,4,5,6,7};
Это всё. Запускаем программу и менее чем за полминуты убеждаемся, что имеется несколько решений (там их будет 96, но большей частью это всякие симметричные варианты).
Для окончательного решения поставленной задачи нам нужно попытаться снизить
до 6 и убедиться, что в этом случае решений не будет. Для
мы оставляем те же
dlist g30 и
dlist g03, а из списка
dlist gt убираем 7. Запускаем и убеждаемся, что решений нет.