Сапёр. Задача построить поле
Доброго времени суток
Помогите, пожалуйста найти ошибку в коде. Задача на скриншоте\
Код:
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 шт):
x, y, k = map(int, input().split())
В дефиниции задачи читаем, что первым идёт количество строк, так что x
- для него неудачное обозначение
field = [list(0 for j in range(x)) for i in range(y)]
и вот оно где вылезло - ширина поля задана x
, а нужно наоборот
Логика такая же
- а внимательность была выше (хотя имена тоже вводят в заблуждение). Возможно, помогло бы просто более релевантное именование переменных - например, height
или rowcount
для количества строк
Копипаста зло. Везде поменяли -
на +
, а в одном месте (как минимум) не поменяли:
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
. Там это сделано без выноса кода в функцию, а просто через использование одного куска кода в цикле, с подстановкой разных значений из коллекции. В таком коде гораздо проще разбираться и сложно ошибиться.