@Yuuki223

Не те выходные данные как починить код?

есть код на python 3.8.10
n, m = map(int, input().split())
field = [input() for _ in range(n)]

# проходимся по всем кнопкам и проверяем, что они не врезаются
for i in range(n):
    for j in range(m):
        if field[i][j] != '.':
            valid_move = any(0 <= i+dx < n and 0 <= j+dy < m and field[i+dx][j+dy] == '.' for dx, dy in [(1,0),(-1,0),(0,1),(0,-1)])
            if not valid_move:
                print('NO')
                exit()

# если все кнопки безопасны, то выводим YES и последовательность ходов
print('YES')
for i in range(n):
    for j in range(m):
        if field[i][j] != '.':
            print(i + 1, j + 1)

входные данные
3 3
112
212
011
выходные должны быть
YES
1 1
1 2
1 3
2 1
2 2
2 3
3 2
3 3
3 1
но выдает NO
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dmshar
А вы точно понимаете, что и зачем вы проверяете в своем коде?
Вот здесь
field = [input() for _ in range(n)]
вы задали свои данные. И пошли по циклу. Как вы думаете, условие
field[i+dx][j+dy] == '.'
хоть когда нибудь на ваших данных (тех, которые вы привели в условии) примет значение True? Очевидно, что в массиве field значений '.' нет. Значит эта составляющая вашего условия ВСЕГДА будет False. Объединив через оператор
0 <= i+dx < n and 0 <= j+dy < m and field[i+dx][j+dy] == '.'

три условия, одно из которых ВСЕГДА равно False, в результате получите разумеется снова False.
any проверит, получилось ли хоть раз у вас True. А поскольку такого, как мы видели, ни разу не было, в свою очередь выдаст False и поместит его в переменную valid_move.
Соответственно,
not valid_move
даст значение True, сработает условие оператора if, выполниться последовательность

print('NO')
       exit()

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

Как работает код я показал. А вот логика ваша мне непонятна вообще. Зачем выписывать условие проверки, которое заведомо никогда не выполняется. Кстати, есть и другие вопросы. Например - если i=j=2, а (например), dx=0, dy=1, то как вы себе представляете элемент массива field[i+dx][j+dy]? Чему будет равно j+dy и какому элементу оно соответствует?
Что за такую дивную задачу вы решаете - вы не сообщаете. Наверное предполагаете, что все должны это угадать, что-бы суметь подсказать вам правильное решение. Но мне почему-то гадать абсолютно не интересно. Поэтому проблемы с вашим кодом обозначил, а с логикой разбирайтесь дальше самостоятельно.
Ответ написан
i229194964
@i229194964
Веб разработчик
for i in range(n):
    for j in range(m):
        if field[i][j] != '.':
            valid_move = True
            for dx, dy in [(1,0),(-1,0),(0,1),(0,-1)]:
                x, y = i+dx, j+dy
                while 0 <= x < n and 0 <= y < m:
                    if field[x][y] != '.':
                        valid_move = False
                        break
                    x += dx
                    y += dy
                if not valid_move:
                    break
            if not valid_move:
                print('NO')
                exit()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы