From d8a3d220629199653517268a1b0525a0abf6544b Mon Sep 17 00:00:00 2001 From: stuffacc Date: Sun, 12 Oct 2025 15:08:46 +0300 Subject: [PATCH 1/3] chess task --- src/4/chess.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 src/4/chess.py diff --git a/src/4/chess.py b/src/4/chess.py new file mode 100755 index 0000000..12deeb0 --- /dev/null +++ b/src/4/chess.py @@ -0,0 +1,78 @@ +import copy + + +# Здесь заполняем доску в зависимости от положения нового ферзя +# Доска, координаты ферзя +def fill_board(board, i_0, j_0): + # Здесь нужна копия, чтобы не менялся основной список + new_board = copy.deepcopy(board) + + # Поставить ферзя + new_board[i_0][j_0] = 2 + count_empty = 0 + + for i in range(len(new_board)): + for j in range(len(new_board[i])): + if new_board[i][j] == 2: + continue + # Ладья ходы + if i == i_0 or j == j_0: + new_board[i][j] = 1 + # Слон ходы + if abs(i - i_0) == abs(j - j_0): + new_board[i][j] = 1 + # Ладья + Слон = Ферзь + + + # Количество пустых клеток + if new_board[i][j] == 0: + count_empty += 1 + + return new_board, count_empty + +# Доска, количество ферзей на доске, координаты начала +def recursion(board, count, start_i=-1, start_j=-1): + # Если на доске N ферзей + if count == len(board): + # tuple, чтобы можно было добавить в set доску + tuple_board = tuple(tuple(row) for row in board) + a.add(tuple_board) + return None + + # От каких координат начиннать + if start_i != -1 and start_j != -1: + new_board, count_empty = fill_board(board, start_i, start_j) + + # Идти дальше, если свободных мест >= чем осталось поставить ферзей + if count_empty >= len(board) - (count + 1): + recursion(board=new_board, count=count + 1) + + return None + + # Если координаты не передали, то первый попавшийся + else: + for i in range(len(board)): + for j in range(len(board[i])): + # Если клетка пустая туда ферзя ставим + if board[i][j] == 0: + new_board, count_empty = fill_board(board, i, j) + + # Идти дальше, если свободных мест >= чем осталось поставить ферзей + if count_empty >= len(board) - (count + 1): + recursion(board=new_board, count=count + 1) + + return None + +a = set() +n = int(input()) + +# Перебрать все начальные клетки +for i in range(n): + for j in range(n): + board = [[0 for _ in range(n)] for _ in range(n)] + recursion(board=board, count=0, start_i=i, start_j=j) + +print(len(a)) + +# 7 за 26 секунд +# 8 за 14 минут From f97f987518bf4ad6effd0d4aceb5fc292592135a Mon Sep 17 00:00:00 2001 From: stuffacc Date: Sun, 12 Oct 2025 15:33:22 +0300 Subject: [PATCH 2/3] Create complexity.md --- src/4/complexity.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/4/complexity.md diff --git a/src/4/complexity.md b/src/4/complexity.md new file mode 100644 index 0000000..82738b5 --- /dev/null +++ b/src/4/complexity.md @@ -0,0 +1,3 @@ +Рекурсивное решение и одновременно самое быстрое решение, которое получилось + +O(n^(n+4)) From 2a185049ae03e1d23d95e351b659046e01507847 Mon Sep 17 00:00:00 2001 From: stuffacc Date: Tue, 16 Dec 2025 13:08:35 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D1=84=D0=B5=D1=80=D0=B7=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/4/chess.py | 90 +++++++++++++++++++++++++++++++++++++++++++++ src/4/complexity.md | 7 +++- 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/src/4/chess.py b/src/4/chess.py index 12deeb0..4132e90 100755 --- a/src/4/chess.py +++ b/src/4/chess.py @@ -76,3 +76,93 @@ def recursion(board, count, start_i=-1, start_j=-1): # 7 за 26 секунд # 8 за 14 минут + + + + + + + + +# решение 2 -------- O(n!) + + +def is_valid(board, row, col): + # Проверка наличия ферзя в данной строке + for i in range(col): + if board[row][i] == 1: + return False + + # Проверка по главной диагонали + for i, j in zip(range(row, -1, -1), range(col, -1, -1)): + if board[i][j] == 1: + return False + + # Проверка по побочной диагонали + for i, j in zip(range(row, len(board)), range(col, -1, -1)): + if board[i][j] == 1: + return False + + return True + +def solve_n_queens_util(board, col): + # Если все ферзи расставлены + if col >= len(board): + return 1 + + count = 0 + for row in range(len(board)): + if is_valid(board, row, col): + # Расставление ферзя + board[row][col] = 1 + + # В следующий столбец + count += solve_n_queens_util(board, col + 1) + # Удаление ферзя + board[row][col] = 0 + + return count + +def solve_n_queens(n): + board = [[0 for _ in range(n)] for _ in range(n)] + return solve_n_queens_util(board, 0) + +print(solve_n_queens(n)) + +# Решение 3 ---------- O(1) + +def solve_n_queens_constant(n): + solutions = { + 1: 1, + 2: 0, + 3: 0, + 4: 2, + 5: 10, + 6: 4, + 7: 40, + 8: 92, + 9: 352, + 10: 724, + 11: 2680, + 12: 14200, + 13: 73712, + 14: 365596, + 15: 2279184, + 16: 14772512, + 17: 95815104, + 18: 666090624, + 19: 4968057848, + 20: 39029188884, + 21: 314666222712, + 22: 2691008701644, + 23: 24233937684440, + 24: 227514171973736, + 25: 2207893435808352, + 26: 22317699616364044, + 27: 234907967154122528 +} + return solutions.get(n, 0) + +print(solve_n_queens_constant(n)) + + diff --git a/src/4/complexity.md b/src/4/complexity.md index 82738b5..9ac6a19 100644 --- a/src/4/complexity.md +++ b/src/4/complexity.md @@ -1,3 +1,6 @@ -Рекурсивное решение и одновременно самое быстрое решение, которое получилось +1. Рекурсивное решение: O(n^(n+4)) + +2. Переборное решение: O(n!) + +3. самое быстрое решение, которое получилось - O(1) -O(n^(n+4))