Как сохранять рекурсивно нужный вариант массива
У меня есть задача: Есть поле 5 на 4, на горизонталях которого расположены слоны разных цветов. Нужно найти алгоритм перестроения слонов (фигуры двигаются по правилам шахмат), при этом слоны никогда не должны атаковать друг друга. Я решил запустить рекурсивную функцию. В ней две функции:
- Если ходит белая фигура, то функция вариант смотрит, куда бы могли пойти все черные слоны;
- Функция рассчитывает все варианты, куда можно пойти из свободных ячеек, пришедшие из первого массива
Сейчас она работает более-менее нормально, но выдает лишние варианты. Я хочу, чтобы она работала до первой найденной стратегии и вывела мне ее
a = [[0 for j in range(4)] for i in range(5)]
ideal = [[2,2,2,2],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[1,1,1,1]]
num_ideal = 0
for i in range(4):
a[0][i] = 1
a[4][i] = 2
def variat(a, x, y, c):
for i in range(5):
for j in range(4):
if a[x][y] == c:
if abs(i - x) == abs(j - y):
a[i][j] = c
def bishop(a, x, y, c, CanSteps):
global num_ideal
lots_of_moves = []
for i in range(5):
for j in range(4):
if (c==1 and i>x) or (c==2 and i<x):
b = copy.deepcopy(a)
if b[x][y] == c and CanSteps[i][j] == 0:
if abs(i - x) == abs(j - y):
b[x][y] = 0
b[i][j] = c
if b != a:
if b == ideal:
draw(b)
num_ideal += 1
print(f'Хороших вариантов: {num_ideal}')
else:
lots_of_moves.append(b)
return lots_of_moves
async def start(a, c):
global num_ideal
if a == ideal :
print('Нет вариантов')
else:
CanSteps = copy.deepcopy(a)
lost = []
c = c % 3
if c == 0:
c = 1
if c == 1:
t = 2
else:
t = 1
for i in range(5):
for j in range(4):
if a[i][j] == c:
variat(CanSteps, i, j, c)
if a[i][j] == t:
lost.append(bishop(a, i, j, t, CanSteps))
for elem in lost:
for i in elem:
# task2 = asyncio.create_task(start(i, c))
task3 = asyncio.create_task(start(i, c+1))
# await task2
await task3
async def main():
task1 = asyncio.create_task(start(a, 1))
await task1
if __name__ == '__main__':
time_start = time.time()
asyncio.run(main())
print(time.time() - time_start)```
Помогите(