print(('No', 'Yes')[p >= abs(v) + abs(w) and not (p + v + w) % 2])
v >= 0 <= w
. Можно построить путь уголком, (v, 0) -> (0, 0) -> (0, w)
. А теперь просто повернём вторую часть пути, (v, 0) -> (0, 0) -> (-w, 0)
, как-будто повернули минутную стрелку часов, а часовую не тронули. Совокупная длина стрелок v + w
как была, так и осталась. Разве не очевидно? print(('No', 'Yes')[p >= abs(v) + abs(w) and not (p - abs(v) - abs(w)) % 2])
{
....
(x, y): [(x-1,y), (x+1, y), (x, y-1), (x, y+1)]
....
}
d = {}
first=list(map(int,input().split()))
n,k=first[0],first[1]
for i in range(n):
point=list(map(int,input().split()))
x=point[0]
y=point[1]
d[x,y] = [(x-1,y), (x+1, y), (x, y-1), (x, y+1)]
print(d)
def Dijkstra(N, S, matrix):
valid = [True]*N
weight = [1000000]*N
weight[S] = 0
for i in range(N):
min_weight = 1000001
ID_min_weight = -1
for i in range(len(weight)):
if valid[i] and weight[i] < min_weight:
min_weight = weight[i]
ID_min_weight = i
for i in range(N):
if weight[ID_min_weight] + matrix[ID_min_weight][i] < weight[i]:
weight[i] = weight[ID_min_weight] + matrix[ID_min_weight][i]
valid[ID_min_weight] = False
return weight
from random import shuffle
n, m = 20, 250 # размер поля, количество дыр
row = [0] * m + [1] * (n * n - m)
shuffle(row)
field = [row[i:i + n] for i in range(0, n * n, n)]
def show():
for r in field:
print('[', *[(' ', '██', '░░')[cell] for cell in r], ']', sep='')
print()
show()
# BFS https://ru.wikipedia.org/wiki/Поиск_в_ширину
row, nxt = field[0], []
for x, cell in enumerate(row):
if not cell:
nxt.append((0, x))
row[x] = 2
while nxt:
cur, nxt = nxt, []
for y, x in cur:
for y1, x1 in (y, x - 1), (y, x + 1), (y - 1, x), (y + 1, x):
if 0 <= y1 < n > x1 >= 0 == field[y1][x1]:
field[y1][x1] = 2
nxt.append((y1, x1))
show()