А вы точно понимаете, что и зачем вы проверяете в своем коде?
Вот здесь
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 и какому элементу оно соответствует?
Что за такую дивную задачу вы решаете - вы не сообщаете. Наверное предполагаете, что все должны это угадать, что-бы суметь подсказать вам правильное решение. Но мне почему-то гадать абсолютно не интересно. Поэтому проблемы с вашим кодом обозначил, а с логикой разбирайтесь дальше самостоятельно.