Шахматы, ходы коня

Условия задачи: Имеется шахматная доска, нам даны координаты коня (от 1 до 8) Нам нужно найти все координаты после 2 ходов конем.

Пример:

Ввод:
5
7
Вывод:
3 3
5 3
7 3
2 4
4 4
6 4
8 4
1 5
5 5
2 6
4 6
6 6
8 6
1 7
3 7
5 7
7 7
2 8
4 8
6 8
8 8

Вот мой код, но он почему то выводит два лишних варианта, не могу разобраться почему

idi=int(input())
idj=int(input())
moves=[[1,2],[1,-2],[-1,2],[-1,-2],
[2,1],[2,-1],[-2,1],[-2,-1]]
a=[]
q=0
for di,dj in moves:
    for ci,cj in moves:
        i=idi+di+ci
        j=idj+dj+cj
        if 0<i<=8 and 0<j<=8 and [i,j] not in a:
            a.append([i,j])
            q+=1 
for i in range(len(a)):
    print(*a[i])
print(q)

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

Автор решения: CrazyElf

Не вижу лишних вариантов. У меня те же 21 вариант получается вашим кодом. И если напечатать доску с вариантами всё выглядит нормально:

print(' ',end=' ')
for j in range(1,9):
  print(j, end=' ')
print()
for i in range(1,9):
  print(i,end=' ')
  for j in range(1,9):
    if [i,j] in a:
      c = 'K'
    else:
      c = '~'
    if i == idi and j == idj:
      c = '#'
    print(c, end=' ')
  print()

  1 2 3 4 5 6 7 8 
1 ~ ~ ~ ~ K ~ K ~ 
2 ~ ~ ~ K ~ K ~ K 
3 ~ ~ K ~ ~ ~ K ~ 
4 ~ ~ ~ K ~ K ~ K 
5 ~ ~ K ~ K ~ # ~ 
6 ~ ~ ~ K ~ K ~ K 
7 ~ ~ K ~ ~ ~ K ~ 
8 ~ ~ ~ K ~ K ~ K 

P.S. Отсортировать как в примере можно вот так:

print('\n'.join(['{} {}'.format(x,y) for x,y in sorted(a, key=lambda x: (x[1],x[0]))]))

Вывод:

3 3
5 3
7 3
2 4
4 4
6 4
8 4
1 5
5 5
2 6
4 6
6 6
8 6
1 7
3 7
5 7
7 7
2 8
4 8
6 8
8 8

Но там скорее всего сортировка такая, потому что само решение было немного другое - перебирались все клетки доски и делалась проверка, дойдёт ли туда конь в два хода, т.е. в обратную сторону логика шла.

→ Ссылка
Автор решения: Тимур Машарипов

Вроде у вас всё с кодом хорошо.

В любом случае, если бы, например, вам сказали просчитать ходы вплоть до четвёртого хода, вы бы использовали 4 вложенных цикла?

Я бы использовал рекурсию.

У меня переменная depth отвечает как раз за то, насколько глубоко нужно просчитать ходы.

Есть функция GetNextMoves. Она на вход принимает координаты коня, а возвращает лист возможных позиций коня спустя ход.

Также есть рекурсивная функция CalculateMoves, которая как раз "ходит" по древу всех вариантов.

В итоге всё записывается в лист globalArr. Однако в нём будут повторяющиеся позиции. Его следует почистить от повторений.

moves=[[1,2],[1,-2],[-1,2],[-1,-2], [2,1],[2,-1],[-2,1],[-2,-1]]
globalArr = []

def CalculateMoves(depth, i, j): 

    arr = GetNextMoves(i, j)

    if depth > 1:

        for move in arr:
            CalculateMoves(depth - 1, move[0], move[1])

    else:

        globalArr.extend(arr)
        #на этом шаге наверное стоит почистить от повторений лист globalArr


def GetNextMoves(i, j):
    arr = []

    for dx, dy in moves:
        x = i + dx
        y = j + dy

        if 0 < x < 9 and 0 < y < 9 and [x, y] not in arr:
            arr.append([x, y])

    return arr

i = int(input())
j = int(input())

CalculateMoves(7, i, j) # глубина хода конём. в вашем случае 2, а не 7

print(globalArr)
→ Ссылка