Страница 1 из 1
Задачка на рекурсию с возвратом о_О
Добавлено: 04 май 2008, 08:29
Emo_Freakie
Собственно задачка простая - расстановка 5 ферзей на кубической доске 5*5*5, чтобы они друг друга не били.
Но я не знаю с какой стороны к ней подойти - сначала пробовала описать класс с полями, в которых лежат координаты - получается довольно муторно.
Поиск в гугле ничего не дал, но что-то мне подсказывает что решение простое и изящное)
Пожалуйста, помогите!!!
Re: Задачка на рекурсию с возвратом о_О
Добавлено: 04 май 2008, 09:16
somewhere
Привет, землячка! Для начала советую описать правила, которые задают ферзю поля удара в 3Д пространстве. Т.к. основываясь на шахматах в 2Д - в пространстве имеем неоднозначное представление полей "под ударом". В общем случае - должна быть создана так называемая "маска" куба, в которой допустим 1-ца говорит о том, что поле под ударом одного из ферзей, 0 - иначе. Расставлять ферзей в места, где маска = 0 - можно рекурсивно, можно полным перебором - зависит от правил удара ферзя.
Вообще на мой взгляд расстановка N ферзей в кубе N*N*N задача скорее математическая и наверняка есть изящное решение. Без правил удара ферзя сказать больше пока не могу.
Re: Задачка на рекурсию с возвратом о_О
Добавлено: 04 май 2008, 11:48
airyashov
Помоему объектное решение тоже красиво, где каждый объект ищет себе место сам.
Re: Задачка на рекурсию с возвратом о_О
Добавлено: 04 май 2008, 15:27
Emo_Freakie
Приветствую, земляк!)
Правила я осилила.
Для диагоналей - (в трёх измерениях i, j, k)
for (x=(-min(min(i,j),k));x<=4-max(max(i,j),k);x++)
{//элемент лежит на диагонали, проходящей через элемент A[i+x, j+x, k+x]
};
for (x=(-max(max(i,j),k));x<=4-max(max(i,j),k);x++)
{//элемент лежит на обратной диагонали
};
C вертикалями и горизонталями думаю просто проверкой на равенство соответсвующих индексов.
вопрос в другом - нужно заставить каждого следующего ферзя просматривать позиции ВСЕХ уже расставленных. Вот как эту рекурсию организовать непонятно(