Решите судоку, используя итеративный поиск в ширину

У меня есть задача решить судоку с использованием итеративного алгоритма поиска в ширину, но я изо всех сил пытаюсь применить этот алгоритм именно к этой проблеме.

Я понял, что мне нужна очередь, и я должен перебирать эту очередь, пока она не станет пустой.

У меня есть следующий алгоритм для проверки значения, соответствует ли оно конкретной ячейке в какой-то момент:

  1. Убедитесь, что таких значений нет в строке.
  2. Убедитесь, что в столбце нет таких значений.
  3. Убедитесь, что в блоке нет таких значений.

Но когда я продолжаю работать с таким алгоритмом, в какой-то момент мне приходится вернуться и изменить ранее выбранное значение, потому что оно может оказаться неправильным.

Как я могу применить поиск с возвратом с помощью BFS к этой проблеме судоку?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В BFS нет необходимости в возврате. Вместо этого BFS предоставляет вам множество параллельных путей. Если окажется, что один путь ведет к несогласованной сетке, он просто умирает. Единственное, что нужно сделать, это ничего не делать с ним, т. е. не помещать следующее полученное из него состояние в очередь, как вы обычно делаете.

Сам обход BFS можно организовать несколькими способами, но вот как он может выглядеть:

Первоначально очередь начинается с исходного состояния сетки. Затем повторяйте следующие шаги до тех пор, пока очередь не пуста и в ней еще есть свободные ячейки:

  • Удалить состояние сетки из очереди.
  • Возьмите следующую свободную ячейку.
  • Определите, какие значения может получить эта свободная ячейка, не нарушая ни одно из перечисленных вами правил.
  • Создайте состояние сетки для каждого из них и поставьте их в очередь.

Ветвь "умирает", когда третий шаг маркера дает возможные значения нет. В этом случае следующий шаг ничего не ставит в очередь, чего вы и хотите. Неверный путь устранен. Цикл продолжится и будет рассматривать другие альтернативные сетки, которые могут присутствовать в очереди.

Привет @trincot. Большое спасибо за ответ. Я немного смущен вашим ответом. Как я должен использовать очередь здесь? Потому что я думал, что я должен взять все соседние ячейки с текущей ячейкой, у которых в настоящее время нет номера, и поместить их в очередь. Можете ли вы пояснить, как должна выглядеть вся идея алгоритма (шаг за шагом)?

Vadim Sheremetov 21.03.2022 22:11

Добавил некоторые пояснения.

trincot 21.03.2022 22:18

Другие вопросы по теме