![]() |
|
|
![]()
|
|
| Greeneyed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Нужно написать программу, расставляющию 5 ферзей но поле 8х8 так,чтобы каждая клетка была под ударом хотябы одного ферзя. Нельзя пользоваться вызывами функцмй,т.е. всё должно быть в одном мудуле. Написать это нужно на С.
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Нужно - ПИШИ, когда напишешь, ту часть кода что работает неверно - в студию.
Алгоритм прост - перебор. 5 вложенных циклов перебора позиций, в них 4 вложенных цикла проверки боев, и никаких функций. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Да. Иных решений нету. Перебор долгий конечно, если не сокращать. А вообще уже обсуждалось, но немного другая задача- чтобы ферзи друг друга не били. Поищи.
-------------------- Всем добра |
|||
|
||||
| Greeneyed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Задачу я, вроде бы, решил. Вот только она выдаёт 5728 вариантом. По-моему многова-то. А ещё я в инете видел, что их всего 4860. Если кому не лень, посмотрити прикреплённый файл.
Присоединённый файл ( Кол-во скачиваний: 27 )
SEMA.C 4,06 Kb |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
А ты повторы проверял?
-------------------- Всем добра |
|||
|
||||
| Greeneyed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Нет. Их там,вроде бы, быть не должно. |
|||
|
||||
| mes |
|
||||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Как минимум есть повторения относительно поворота доски на 180 градусов. Взять хотя бы последнюю позицию, если повернуть доску - то она станет первой. Чтоб такого не происходило перемешение одного из ферзей надо ограничить половиной доски: Т.е вместо
Поставить
К сожалению нет возможности проверить , буду рад если кто проверит и скажет сколько вариантов получится. P.S. Я думаю в строчке:
P.S.S. Способ определения битых полей у тебя слишком "громоздкий" - много бесполезных операций- поле деятельности для оптимизации. |
||||||||||||
|
|||||||||||||
| Greeneyed |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Ну, тогда поворот на 90 градусов.
Да я и сам знаю. Но ничего попроще придумать не могу. Это сообщение отредактировал(а) Greeneyed - 23.4.2006, 14:41 |
||||
|
|||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Ну например чтоб найти месторасположение ферзя не нужно просматривать каждую клетку. У тебя есть номер клетки, а его легко превратить в номер горизонтали и вертикали. например для ферзя е:
для горизонтали можно и подругому: искатъ не номер горизонтали, а номер клетки, с которой начинается горизонталь. например, чтоб для ферзя найти номер клетки, с которой начинается горизонталь на которой он рассположен, надо стереть последние 3 бита (остаток от деления на 8):
Для диагонали: мы уже нашли номер горизонтали и вертикали (f_e_x, f_e_y). Чтоб найти начало одной из диагоналей нужно из обоих переменных вычесть наименьшую из них. Как найти конец первой диагонали и полностью вторую диагональ я думаю понятно P.S. мне кажется если для ферзей вместо группы переменных ты создашь массив будет легче организовать цикл заполнения битых полей. P.S.S
так как у 9 в любом случае последний бит равен 1. Но ето дело вкуса. Добавлено @ 18:18
Только что проверил твой исходник. После обнуления счетчика ( int j=0; Значит в принципе у тебя всё правильно. |
||||||||
|
|||||||||
| Greeneyed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Спасибо. Буду исправлять.
|
|||
|
||||
| Greeneyed |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 20.4.2006 Репутация: нет Всего: нет |
Препод - нехороший человек!!!!!!!!!!!!! Сказал, чтоб я всё сделал через функции и, чтобы можно было задавать положение первого ферзя. Никак не могу придумать функцию полного перебора. Помогите пожалуйста.
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
В таком виде пойдет?
Решил подробнее остановится на этом фрагменте:
Допустим у нас ферзь стоит на 20-м (E3) поле: ето 3 поле по вертикали : 1+(20>>3) = 3 (D[3]) и 5 поле по горизонтали: 1 <<(20 & 7) = 16 или двоичном: 0001 0000, (пятый [по номеру] бит). значит его положение на битовой доске D[3]=16; Надеюсь, всё понятно. Если нет, спрашивай ... |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Не доконца понял, что требуется. Требуется, чтоб можно было задать начальное поле ?
или жестко зафиксировать позицию одного ферзя ? В таком случае задаешь цикл для четырех ферзей и проверку на занятость поля 5м ферзем. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
Решил доработать код, вот что получилось :
Это сообщение отредактировал(а) mes - 2.6.2006, 11:36 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |