Как сохранять рекурсивно нужный вариант массива

У меня есть задача: Есть поле 5 на 4, на горизонталях которого расположены слоны разных цветов. Нужно найти алгоритм перестроения слонов (фигуры двигаются по правилам шахмат), при этом слоны никогда не должны атаковать друг друга. Я решил запустить рекурсивную функцию. В ней две функции:

  1. Если ходит белая фигура, то функция вариант смотрит, куда бы могли пойти все черные слоны;
  2. Функция рассчитывает все варианты, куда можно пойти из свободных ячеек, пришедшие из первого массива

Сейчас она работает более-менее нормально, но выдает лишние варианты. Я хочу, чтобы она работала до первой найденной стратегии и вывела мне ее

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)```
Помогите( 

Ответы (0 шт):