diff --git a/src/09.10.2025/complexity.md b/src/09.10.2025/complexity.md new file mode 100644 index 0000000..f338bc9 --- /dev/null +++ b/src/09.10.2025/complexity.md @@ -0,0 +1,26 @@ +анализ сложности решений задачи N ферзей. + + + +переборное решение. + +сложность: O(N! × N²), так как генерирует все перестановки N элементов: O(N!); +для каждой перестановки проверяет корректность: O(N²) операций; +и в худшем случае проверяет все N! расстановок. + + + +рекурсивное решение. + +сложность: O(N!) работает быстрее, чем полный перебор. +в худшем случае перебирает все возможные расстановки: O(N!); +но отсекает многие неподходящие ветви на ранних этапах, что ускоряет процесс работы. + + + +быстрое решение. + +сложность: O(N!). +использует битовые операции, что значительно ускоряет проверки: + 1)проверка столбцов и диагоналей: O(1); + 2)поиск доступных позиций: O(1) с битовыми операциями. diff --git a/src/09.10.2025/queen_fast.py b/src/09.10.2025/queen_fast.py new file mode 100755 index 0000000..36dc971 --- /dev/null +++ b/src/09.10.2025/queen_fast.py @@ -0,0 +1,24 @@ +def fast_n_queens(n): + def solve(row, columns, d1, d2): + if row == n: + return 1 + + count = 0 + available = ((1 << n) - 1) & ~(columns | d1 | d2) + + while available: + position = available & -available + available -= position + + count += solve( + row + 1, columns | position, (d1 | position) << 1, (d2 | position) >> 1 + ) + + return count + + return solve(0, 0, 0, 0) + + +n = int(input("введите количество ферзей N: ")) +result = fast_n_queens(n) +print(f"количество корректных расстановок {n} ферзей: {result}") diff --git a/src/09.10.2025/queen_pereborka.py b/src/09.10.2025/queen_pereborka.py new file mode 100755 index 0000000..6c63a97 --- /dev/null +++ b/src/09.10.2025/queen_pereborka.py @@ -0,0 +1,26 @@ +import itertools + +def is_valid_board(board): + n = len(board) + for i in range(n): + for j in range(i + 1, n): + if abs(i - j) == abs(board[i] - board[j]): + return False + return True + + +def brute_force_n_queens(n): + count = 0 + for permutation in itertools.permutations(range(n)): + if is_valid_board(permutation): + count += 1 + return count + + +n = int(input("введите количество ферзей N от 1 до 10: ")) + +if n < 1 or n > 10: + print(f"N={n} не подходит для переборного метода.") +else: + result = brute_force_n_queens(n) + print(f"количество корректных расстановок {n} ферзей: {result}") diff --git a/src/09.10.2025/queen_recursion.py b/src/09.10.2025/queen_recursion.py new file mode 100755 index 0000000..253fcd0 --- /dev/null +++ b/src/09.10.2025/queen_recursion.py @@ -0,0 +1,22 @@ +def recursive_n_queens(n): + def is_safe(board, row, col): + for i in range(row): + if board[i] == col or abs(board[i] - col) == abs(i - row): + return False + return True + + def solve(row, board): + if row == n: + return 1 + count = 0 + for col in range(n): + if is_safe(board, row, col): + board[row] = col + count += solve(row + 1, board) + return count + + return solve(0, [-1] * n) + +n = int(input("введите количество ферзей N: ")) +result = recursive_n_queens(n) +print(f"количество корректных расстановок {n} ферзей: {result}")