Skip to content

Commit d8a3d22

Browse files
author
stuffacc
committed
chess task
1 parent 6e31449 commit d8a3d22

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

src/4/chess.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import copy
2+
3+
4+
# Здесь заполняем доску в зависимости от положения нового ферзя
5+
# Доска, координаты ферзя
6+
def fill_board(board, i_0, j_0):
7+
# Здесь нужна копия, чтобы не менялся основной список
8+
new_board = copy.deepcopy(board)
9+
10+
# Поставить ферзя
11+
new_board[i_0][j_0] = 2
12+
count_empty = 0
13+
14+
for i in range(len(new_board)):
15+
for j in range(len(new_board[i])):
16+
if new_board[i][j] == 2:
17+
continue
18+
# Ладья ходы
19+
if i == i_0 or j == j_0:
20+
new_board[i][j] = 1
21+
# Слон ходы
22+
if abs(i - i_0) == abs(j - j_0):
23+
new_board[i][j] = 1
24+
# Ладья + Слон = Ферзь
25+
26+
27+
# Количество пустых клеток
28+
if new_board[i][j] == 0:
29+
count_empty += 1
30+
31+
return new_board, count_empty
32+
33+
# Доска, количество ферзей на доске, координаты начала
34+
def recursion(board, count, start_i=-1, start_j=-1):
35+
# Если на доске N ферзей
36+
if count == len(board):
37+
# tuple, чтобы можно было добавить в set доску
38+
tuple_board = tuple(tuple(row) for row in board)
39+
a.add(tuple_board)
40+
return None
41+
42+
# От каких координат начиннать
43+
if start_i != -1 and start_j != -1:
44+
new_board, count_empty = fill_board(board, start_i, start_j)
45+
46+
# Идти дальше, если свободных мест >= чем осталось поставить ферзей
47+
if count_empty >= len(board) - (count + 1):
48+
recursion(board=new_board, count=count + 1)
49+
50+
return None
51+
52+
# Если координаты не передали, то первый попавшийся
53+
else:
54+
for i in range(len(board)):
55+
for j in range(len(board[i])):
56+
# Если клетка пустая туда ферзя ставим
57+
if board[i][j] == 0:
58+
new_board, count_empty = fill_board(board, i, j)
59+
60+
# Идти дальше, если свободных мест >= чем осталось поставить ферзей
61+
if count_empty >= len(board) - (count + 1):
62+
recursion(board=new_board, count=count + 1)
63+
64+
return None
65+
66+
a = set()
67+
n = int(input())
68+
69+
# Перебрать все начальные клетки
70+
for i in range(n):
71+
for j in range(n):
72+
board = [[0 for _ in range(n)] for _ in range(n)]
73+
recursion(board=board, count=0, start_i=i, start_j=j)
74+
75+
print(len(a))
76+
77+
# 7 за 26 секунд
78+
# 8 за 14 минут

0 commit comments

Comments
 (0)