|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||||||
Реализовать алгоритм всех возможных комбинаций восьми ферзей19.05.2016, 05:11. Показов 7294. Ответов 119
Доброго времени суток! Мне стыдно задавать такой вопрос, но всё же, как реализовать алгоритм всех возможных комбинаций восьми ферзей?
Используйте исчерпывающий «лобовой» подход, т.е. попробуйте все возможные комбинации восьми ферзей на шахматной доске. Я, думаю, что как-то так: Пройтись по всем строкам и столбцам, выяснить возможно ли поставить ферзей с таких то координат, (0, 0), (0, 1), (0, 2)....(0, 7) , (1, 0) (1, 1) .... ну и так далее до (7, 7) и каждую координату обрабатывать, выясняя, если поставить первого ферзя на на эти коордитаты, то остальные семь ферзей возможно ли разместить на доске. Вот такая вот идея решения) Но решение не могу написать, функция обработки не получается почему-то... Кликните здесь для просмотра всего текста
Я уже несколько дней с этой задачей маюсь, надо всё же понять как решать подобное, не просто скопировать код, а понять как это решать, ну и подобные, соответственно.Смотрел примеры решения, но не понял код, что, куда, зачем, например
Попрошу сильно не пинать, форум насколько я понял для начинающих! Спасибо!
0
|
|||||||||||
| 19.05.2016, 05:11 | |
|
Ответы с готовыми решениями:
119
Сортировка всех возможных комбинаций 4 из 8 Создание всех возможных комбинаций английского алфавита Перебор всех возможных комбинаций |
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||||||
| 19.05.2016, 23:27 [ТС] | |||||||||||
|
Вот этот код не аналогичен коду проверок из функции tst?
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
|||||||||||
| 19.05.2016, 23:37 | |
|
Очевидно, что нет. Это ваши процедуры, которые ничего не возвращают, а только изменяют глобальную борду, увеличивая/уменьшая счетчики сколько раз какая клетка бьется. Моя tst экологически чистая - ничего не изменяет, просто тестирует (как понятно из ее названия - вот он, самодокументирующийся кот
) и возвращает результат теста.Добавлено через 2 минуты ЗЫ попробуйте решить задачку - даны 2 точки с координатами каждой: (i,j) и (x,y). Определить, находятся ли они на одной горизонтали или диагонали (любой). Решите для начала это.
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||
| 19.05.2016, 23:56 [ТС] | |||
|
Show() вроде бы понятно, выводит значения массива, а перед ними выводи Латинску букву + i т.е. A, B, C, D, E... не понятно почему m[i] + 1 это слегка озадачило, но, думаю, решаемо. Затем вызывает саму себя для следующего столбца, если i у вас столбец. Иначе, если условие не выполнено вывести перевод строки. Понятно, что tst сама по себе, но она же в связке с другими функциями работает, а те в свою очередь тоже производят рекурсивные вызовы. Странно, но я ещё не понял её досканально, для меня это ещё слово, значение которого я не знаю.
0
|
|||
| 20.05.2016, 00:02 | |||
То есть show просто выводит на экран очередной найденный вариант расстановки - в полном соответствии с принципами самодокументирующегося кота, несоблюдение которых мне тут вменяли выше ![]() Рекомендую не игнорировать мою тривиальную задачку парой постов выше.
0
|
|||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||
| 20.05.2016, 05:38 [ТС] | |||||||
Добавлено через 1 час 26 минут Кликните здесь для просмотра всего текста
Не знаю подойдёт ли, но работает.
0
|
|||||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 20.05.2016, 08:51 | ||
|
0
|
||
| 20.05.2016, 13:27 | |||
|
Mr.X, да, а 1 = 1 в экстенсиальном смысле
![]() ЗЫ
0
|
|||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||
| 20.05.2016, 23:42 [ТС] | |||||||
|
Я так понял в том коде, который описывали выше функции f() и loop() это всего лишь реализация алгоритма повторения, цикл проще говоря по стокам и столбцам, ну или столбцам и стокам у вас? Увеличили столбец, проверили, условие не выполнено идём в tst смотрим, если истинно , вызываем рекурсивно tst(i, j, k + 1); и так пока либо условие не выполнится, либо одна из проверок не покажет ложь. И так пока либо не проходим все 8 строк, либо, если прошли все итерации по столбцу, а результата нет, идём на предыдущую строку и вызываем её с увеличенным на один столбцом и так далее. Говорю же, потихоньку ясность насупает ![]() Пошёл думать, может и решу задачку, но диагонали меня как-то настараживают! ![]() Добавлено через 1 час 36 минут Кликните здесь для просмотра всего текста
Что-то навеяло)
0
|
|||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|
| 21.05.2016, 03:53 [ТС] | |
|
Я уже долго с ней медетирую, но даже с учётом открывшегося мне откровения ясности мало. Так что можно и помедитировать
0
|
|
| 21.05.2016, 04:21 | |
|
Можете начать с медитаций над другими, совсем тривиальными котами, например Определить, имеется ли среди цифр натурального числа N
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||||||
| 21.05.2016, 05:45 [ТС] | |||||||||||
|
Когда я смотрел в массиве, то было понятно, что если я произвожу некоторые манипуляции с данными, например,
![]() По горизонтали (i - k) - это столбцы, если следовать вашей стратегии, мы их вычитаем и... а это значит (j - m[k]) строка и некое значение в массиве, значит если они равны, то происходит бой фигуры. Если, например условие (i - k) != (j - m[k]) = 3, а условие (i - k) != (m[k] - j) = -3, то оба условия участвуют в проверке или только то, у кого значение положительное, я к чему это спрашиваю, когда писали функции задавили проверки чтобы значение не вышло за пределы массива, соответственно, например, i < 7 && i > 0; а здесь -3 значит оно не участвует в данной проверке или здесь сново всё иначе? Если они всегда симметричны, то это может означать, что они всего лишь ходят по разным диагоналям Пока не разберусь какое значение за какую диагональ отвечает не пойму алгорит. Ещё есть такой момент, когда функция удовлетворяет условию j < 8; мы вытасквиваем из стека всё семь значений, которые туда положили, и начинаем ходить с других координат, с предыдущей строки, стольца, так? Но как он понимает какие именно координаты нужны и где это задаётся какие значения нужно выбирать? Первые после тех 7, которые мы только что вытащили? Добавлено через 7 минут Я так понял, последовательно число делится на 8 и проверяется на предмет остатка равного 1, если такое присутствует то возвращаем истину иначе ложь! Добавлено через 52 минуты Получается, если я захочу проверку проводить и по вертикали, то это будет выглядеть как
0
|
|||||||||||
| 21.05.2016, 06:26 | ||||||||
![]()
0
|
||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|
| 21.05.2016, 21:42 [ТС] | |
|
Здесь я имел ввиду чисто гипотетическую ситуацию, если бы я захотел проверить по вертикали, наверное, так надо было написать.
Код, который вы просили описать т.е. поколдовать над ним, как моё описание верно или опять не совсем то)
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|
| 21.05.2016, 22:11 [ТС] | |
|
А по диагоналям как-то так
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|
| 22.05.2016, 23:23 [ТС] | |
|
Похоже теоретически я понял, но вот воспроизвести не смог, имею виду, не смог что-то подобное, но именно своё написать.
Добавлено через 24 минуты _Ivana Дружище,а если бы я захотел делать проверку подобную той, которая у вас в коде присутствет, но вместо одномерного массива включить двумерный, такой компактный код уже не получается? Я пробовал, но первое как отмечать координаты, подобно тому, как отмечается в одномерном массиве, но так и не дошёл до чего то более менее вразумительного, втрое не понятно, когда при проверке мы просмотрели все строки или столбцы и все позиции оказались бъющимися, мы начинаем делать ход с предыдущей удачной постановки ферзя т.е. с координат на которые он установлен, и соответсвенно проделываем все шаги с этими координатами, если удача и не бъётся, то в одномерном массиве мы просто меняем значение строки(у вас) , а в двумерном массиве как это может выглядеть, не представляю. Я хочу выводить все удачные расстановки, поэтому сразу решил было устанавливать координаты и по этим коордтинатам отмечать, что на этом месте стоит фигура, ну например так, "[]" но возвращаясь к предыдущим строкам, если мы начнём делать проверку со строки с предыдущими координатами, то при удачном стичении обстоятельств, при постановки фигуры на новый столбец этой же строки, становяться две фигуры на одной строке так как предыдущая не затирается, получается полный бред. Поэтому зделал вывод, что в вашей процедуре всё заточено под одномерный массив ![]() Всё вроде бы просто и в тоже время не просто
0
|
|
| 22.05.2016, 23:37 | |
|
Дело не в одномерном/двумерном массиве и вообще не в структуре данных хранения расстановки - она может быть любой, позволяющей реализовать алгоритм. В алгоритм надо въехать просто
Тут классика - обход графа в глубину (можешь погуглить), то есть например: мы ставим первого ферзя на А1 и перебираем варианты расстановок остальных семи, которые удовлетворяют условию, потом переставляем первого на А2 - и делаем то же самое. Причем, не только для первого ферзя работает эта логика - для любого ферзя мы в цикле ставим его на все клетки поля, где он не бьется и пробуем доставить остальных - если доставили, то выводим результат, если какого-то ферзя никуда нельзя поставить чтобы он не бился - прерываем разбор этой ветки. А в каких структурах данных хранить расстановки - неважно, главное четко уметь "забывать" или "очищать" расстановки последующих ферзей при возврате на уровень выше в рекурсии. И в ситуации с одномерным массивом это делается очень просто (хотя и неявно) - индекс массива помнится свой в каждом уровне рекурсивного вызова (т.к. он является входящим параметром функции).
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
||
| 22.05.2016, 23:53 [ТС] | ||
|
Да, кстате, если по условию задачи, то, на сколько я понял, мне нужно найти все возможные варианты расстановки ферезй т.е. начать вызывать с координатами 0, 0 , а закончить 7, 7 . Это моё видение, но если допустим, функциия дошла до координат 7, 7 , то по сути она по условию выхода практически сразу же завершится, так?
Обход графа в глубину посмотрю обязательно. Главное чтобы по проще описано было ![]()
0
|
||
| 23.05.2016, 00:02 | ||
|
Только чтобы не было дублирующихся расстановок (одних и тех же по координатам, но отличающихся по "порядковым номерам" ферзей на них), надо следующего ферзя ставить на клетки больше (лексикографически) текущей, поэтому если первый ферзь у вас стоит на 7,7 то остальных ставить некуда
Одномерный массив на порядки экономит время за счет того, что там явно каждый следующий ферзь ставится в следующий столбец. Но вы пока можете не оптимизировать до такой степени, и работать с вашим любимым двумерным массивом, только не забывая очищать следующих ферзей при возврате к предыдущим.ЗЫ кстати, в той теме, откуда вы взяли мой код, он выводит все варианты расстановки в консоли в псевдографическом режиме с задержкой. Так что не обязательно для красивой визуализации держаться мертвой хваткой за двумерный массив ![]() ЗЗЫ Буквально сейчас в новостях чествуют питерскую команду - победителей чемпионата мира по программированию. Вы думаете у них в задачах в конце были приписки типа "использовать поиск в глубину" или "решать через динамическое программирование - рекурсия с мемоизацией"?
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||||
| 23.05.2016, 05:10 [ТС] | |||||||||
![]() Ну, а если серьёзно, то не нужно равнять тех кто ездит на чемпионат мира по программированию и меня, я не знаю, конечно, но по мне это тоже самое что выставить какого-нибудь дрища, который о спорте где-то, когда-то слышал против чимпиона мира по боксу к примеру, сам понимаешь каков исход битвы. Вот и здесь тоже самое ![]() ![]() Просто хотел выводить как обычно что-то похожее на доску с метками, которые, условно, обозначают ферзей, до красоты мне ещё далеко я так пологаю. Значит ваш алгоритм и есть тот самый поиск в глубину. Вместо цикла, скажем, for вы создали свой из двух функций. Если это так, то значит я врубился в алгоритм, тогда что, функция проверки вроде тоже понятна, не понял или точнее не совсем допонял, как эти диагональные движения происходят, а так ясно. Если я так буду делать (j - k) != (i - m[k]) чтобы понятней было мне i - строка, j - столбец всё будет дастишь фантастишь ![]() Я о таком и не слышал, нет что-то в голове всплывает читал вроде у Касперски. К. но там это называется косичкой, как-то так не хочу врать. А как и с чего учится, вот сейчас я прочём, как вы наверно поняли главу о массивах, да примеры были, но и близко подобных задачь не решали, даже теоретически. Я всё же, думаю, что автор имел ввиду более простое решение, хотя и не уверен в этом. вот какая идея меня посетила с просони Кликните здесь для просмотра всего текста
0
|
|||||||||
| 23.05.2016, 05:10 | |
|
Генератор всех возможных комбинаций Генерация всех возможных комбинаций
Выбор всех возможных комбинаций из Списка
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|