Skip to content

Домашнее задание 4.1. Задача о расстановке ферзей. Разгуляева А.И.#4

Open
ada1ra wants to merge 5 commits intomainfrom
hw_4-1_queen
Open

Домашнее задание 4.1. Задача о расстановке ферзей. Разгуляева А.И.#4
ada1ra wants to merge 5 commits intomainfrom
hw_4-1_queen

Conversation

@ada1ra
Copy link
Owner

@ada1ra ada1ra commented Oct 9, 2025

Добавлено домашнее задание 4.1. Задача о расстановке ферзей

  • добавлено переборное решение (bruteforce)
  • добавлено рекурсивное решение (backtracking)
  • добавлено самое быстрое решение (рекурсивное с множествами)
  • добавлен файл с оценкой сложности
  • добавлен pyproject.toml (для ruff)

Разгуляева А.И.

@ada1ra ada1ra requested a review from chernishev October 9, 2025 20:10
Copy link

@Godrik0 Godrik0 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странно, что решение с использованием множеств работает для меньших n в сравнении со вторым решением

@@ -0,0 +1,41 @@
def backtrack(row, columns, diagonal1, diagonal2):
if row == n:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Переменная n не объявлена нигде в функции и не передается как её аргумент. Сейчас код берет n из глобального цикла, но стоит написать queens_simple(10) и он падает:

Traceback (most recent call last):
  File "main.py", line 41, in <module>
    queens_simple(10)
  File "main.py", line 36, in queens_simple
    return backtrack(0, set(), set(), set())
  File "main.py", line 2, in backtrack
    if row == n:
NameError: name 'n' is not defined

def solve_recursive(n, row, board, solutions):
# рекурсивно находит все решения
if row == n:
solutions.append(board)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут добавляется не копия доски board, а ссылка на один и тот же список. При этом при изменении board в следующих ветках рекурсии, сохраненные решения так же изменятся.
Лучше использовать счетчик, так как копирование board не имеет смысла и требует дополнительных ресурсов.


## 1. Переборное решение (bruteforce)

**Сложность:** O(N! * N²)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для написания формул можно использовать $$: $N! \cdot N^2$

- Фактическое количество рекурсивных вызовов меньше N!
- Проверка валидности за O(N) на каждом уровне

**Применение:** Работает для N ≤ 15-20 за нормальное время
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вы уверены, что оно будет работать для 20?...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants