|
Модераторы: Poseidon |
|
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Добрый День!!! помогите Пожалуйста придумать и запрограммировать алгоритм к следующей задаче: Найдите такую расстановку пяти ферзей на шахматной доске, при которой каждое поле будет находиться под ударом одного из них. Использовать рекурсивные функции.
|
|||
|
||||
Silent |
|
|||
Опытный Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
А что тут думать-то? тут писать надо
Держи (правда на C#, но у тебя же есть опыт перевода C#->Java ;-) ):
Количество вариантов - 728, что, кстати, совпадает с другими программами. |
|||
|
||||
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent, а каким алгоритмом нужно руководствоваться при написании кода к данному заданию: "Найдите такую расстановку пяти ферзей на шахматной доске, при которой каждое поле будет находиться под ударом одного из них." ?
|
|||
|
||||
Silent |
|
|||
Опытный Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
Вообще-то можно решать эту задачу несколькими алгоритмами: полный перебор, перебор с эвристиками, минимальное доминирующее множество и т.п.
В данном случае от тебя требовалось сделать перебор, ну или максимум перебор с эвристиками, организовав его с помощью рекурсивной функции поиска. Обычная перечислительная комбинаторика |
|||
|
||||
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent, А каким требованиям должна удовлетворять постановка ферзя, чтобы выполнялось условие задачи? ("каждое поле будет находиться под ударом одного из них")
как можно переписать код, с использованием методов, которые ставят и убирают ферзя :
|
|||
|
||||
Silent |
|
|||
Опытный Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
Формулировка "каждое поле будет находиться под ударом одного из них" подразумевает, что на конечной расстановке ферзей любая клетка поля будет биться только лишь одним ферзем.
Сходу я не могу придумать, как изменить алгоритм чтобы ферзя можно было поставить только по этому условию, однако, как подсказывает здравый смысл, нафиг особо такое не надо - в любом случае эта оптимизация будет подмножеством вышереализованного мной алгоритма (ибо нужно чтобы ферзи друг дружку не били): для конечной расстановки просто проверять этот факт. А это просто-напросто немного модифицировать процедуру AllFill() - поменять тип массива f на int, и вместо f[i,j] = true инкрементить f[i,j]++. Если в итоге будут единички (а в позициях ферзей 4) - значит гут, расстановка нам подходит. |
|||
|
||||
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent, скажите Пожалуйста, за что отвечает переменная level?
Добавлено через 3 минуты и 36 секунд Silent, Перепишите Пожалуйста вот этот кусочек кода на Ява:
|
|||
|
||||
Mirkes |
|
|||
Опытный Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Ошибка. Эта фраза означает всего лишь, что каждое поле будет биться ХОТЯ БЫ ОДНИМ ферзем. Нельзя поставить на шахматную доску даже двух ферзей так, чтобы ни одно поле не пробивалось двумя ферзями. (опыт шахматиста). В принципе можно организоват перебор просто ставя или снимая ферзя, но это будет совсем полный перебор. Для этого достаточно создать доску типа int[8][8]. Обнулить. Далее запускаем процедуру поиска с уровнем 0 (нет поставленных ферзей) В процедуре поиска Проверяем уровень. Если он =5, то проверяем наличие нулевых клеток. Если их нет, то это решение, его можно выводить. Если уровень 5 и есть нулевые клетки - возврат. перебираем все клетки по x и y от 1 до 8. Если клетка нулевая ставим ферзя и вызываем следующую процедуру поиска с уровнем на 1 больше. Снимаем ферзя. По окончании цикла - возврат Процедура поставить ферзя. По горизонтали, вертикали и обеим диагоналям от позиции ферзя в каждую клетку добавляем по 1. В позицию ферзя добавляем 100. (не обязательно 100, но точно больше 4). Процедура снять ферзя - тоже что поставить, но вместо увеличения - вычитаем. -------------------- Mirkes |
|||
|
||||
Mirkes |
|
|||
Опытный Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Пожалуйста, но я не понимаю, в чем был затык у вас
-------------------- Mirkes |
|||
|
||||
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Mirkes, Спасибо Вам большое за помощь!!! как можно переделать код, чтобы тут был метод, который будет распечатывать расстановки (ферзь обозначается "*", клетка ".")?
Как организовать подсчёт расстановок? |
|||
|
||||
Mirkes |
|
||||
Опытный Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
нужно заменить на фрагмент распечатки поля. Например такой
Насчет подсчета найденных ситуаций все несколько хуже - при проверке программы я обнаружил, что каждая позиция находится пять раз. Так что и доски будут распечатываться по пять раз. Есть такой вариант выхода из положения: запоминать найденные позиции и прежде чем печатать проверять не печатали ли ее раньше. -------------------- Mirkes |
||||
|
|||||
Merhaba |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Mirkes,
Для какой цели нам требуется снимать ферзя? |
|||
|
||||
Mirkes |
|
|||
Опытный Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Постановка ферзя порит поле, снятие ферзя приводит поле к исходному состоянию.
-------------------- Mirkes |
|||
|
||||
Правила форума "Центр помощи" | |
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |