Сапёр. Задача построить поле

Доброго времени суток

Помогите, пожалуйста найти ошибку в коде. Задача на скриншоте\

Условие

Код:

x, y, k = map(int, input().split())
mines = []
for i in range(k):
    a, b = map(int, input().split())
    mines.append((a - 1, b - 1))
field = [list(0 for j in range(x)) for i in range(y)]
for mine in mines:
    field[mine[1]][mine[0]] = "*"
    if mine[1] - 1 >= 0 and mine[0] - 1 >= 0 and field[mine[1]-1][mine[0]-1] !="*":
        field[mine[1]-1][mine[0]-1] += 1
    if mine[1] - 1 >= 0 and field[mine[1]-1][mine[0]] !="*":
        field[mine[1]-1][mine[0]] += 1
    if mine[1] - 1 >= 0 and mine[0] + 1 <= (x-1) and field[mine[1]-1][mine[0]+1] !="*":
        field[mine[1]-1][mine[0]+1] += 1
    if mine[0] - 1 >= 0 and field[mine[1]][mine[0]-1] !="*":
        field[mine[1]][mine[0]-1] += 1
    if mine[0] + 1 <= (x-1) and field[mine[1]][mine[0]+1] !="*":
        field[mine[1]][mine[0]+1] += 1
    if mine[1] + 1 <= (y-1) and mine[0] - 1 >= 0 and field[mine[1]+1][mine[0]-1] !="*":
        field[mine[1]+1][mine[0]-1] += 1
    if mine[1] + 1 <= (y-1) and field[mine[1]+1][mine[0]] !="*":
        field[mine[1]+1][mine[0]] += 1
    if mine[1] + 1 <= (y-1) and mine[0] + 1 <= (x-1) and field[mine[1]+1][mine[0]-1] !="*":
        field[mine[1]+1][mine[0]+1] += 1
for i in range(x):
    for j in range(y):
        print(field[j][i], end = " ")
    print()

При закрытой проверке показывает неверный ответ. На каких входных данных он получен я не знаю. Когда сам вбивал значения вроде не было ошибок

Есть другое решение:

x, y, k = map(int, input().split()) 
mines = []
for i in range(k):
    a, b = map(int, input().split())  
    mines.append((a - 1, b - 1))  


field = [[0 for j in range(y)] for i in range(x)]


directions = [
    (-1, -1), (-1, 0), (-1, 1),
    (0, -1),           (0, 1),
    (1, -1), (1, 0), (1, 1)
]

for mine in mines:
    field[mine[0]][mine[1]] = "*"  
    for d in directions:
        new_x = mine[0] + d[0]  
        new_y = mine[1] + d[1]  
        
        if 0 <= new_x < x and 0 <= new_y < y and field[new_x][new_y] != "*":
            field[new_x][new_y] += 1  


for i in range(x): 
    for j in range(y):  
        print(field[i][j], end=" ")
    print()

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


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

Автор решения: MBo
x, y, k = map(int, input().split())

В дефиниции задачи читаем, что первым идёт количество строк, так что x - для него неудачное обозначение

field = [list(0 for j in range(x)) for i in range(y)]

и вот оно где вылезло - ширина поля задана x, а нужно наоборот

Логика такая же - а внимательность была выше (хотя имена тоже вводят в заблуждение). Возможно, помогло бы просто более релевантное именование переменных - например, height или rowcount для количества строк

→ Ссылка
Автор решения: CrazyElf

Копипаста зло. Везде поменяли - на +, а в одном месте (как минимум) не поменяли:

if mine[1] + 1 <= (y-1) and mine[0] + 1 <= (x-1) and field[mine[1]+1][mine[0]-1] !="*":
                                                                            ^^^ +1
    field[mine[1]+1][mine[0]+1] += 1

Не пишите код копипастой. Такое невозможно проверять глазами и в таком коде очень легко ошибиться. Выделяйте общее и выносите в функции, которые вызывайте с разными параметрами. Которые можно выбирать из коллекции, как во втором вашем примере кода, который написан с соблюдением принципа DRY. Там это сделано без выноса кода в функцию, а просто через использование одного куска кода в цикле, с подстановкой разных значений из коллекции. В таком коде гораздо проще разбираться и сложно ошибиться.

→ Ссылка