Упрощение алгоритма для диагонального поиска
Задача простая донельзя, но я что-то застрял.
Имеется поле H на W

Нужно пройтись по координатам по диагонали, как показано на картинке.
Вот мой код, но мне кажется задачу можно решить элегантнее, без лишних переменных.
H = 11
W = 14
for j in range(0,H+1):
i = 0
for k in range(j,-1,-1):
print(i,k)
i+=1
for j in range(W,-1,-1):
i = 0
for k in range(j,W+1):
print(i,k)
i+=1
for j in range(0,H+1):
i = 0
for k in range(j,-1,-1):
print(i,k)
i+=1
for j in range(W,-1,-1):
i = H
for k in range(j,W+1):
if i<0:
break
print(i,k)
i-=1
Подскажите пожалуйста, как это сделать.
Ответы (3 шт):
Автор решения: MiniMax
→ Ссылка
Двумерный массив table создаю для демонстрации результата.
#!/usr/bin/python3
from pprint import pprint
h = 11
w = 14
table = [[0 for j in range(w + 1)] for i in range(h + 1)]
x, y = 0, 0
step_num = 18
num = 1
while num <= step_num:
x_tmp = x
while x_tmp >= 0 and num <= step_num:
table[y][x_tmp] = num
x_tmp, y = x_tmp - 1, y + 1
num += 1
x, y = x + 1, 0
pprint(table)
Output
[[1, 2, 4, 7, 11, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[3, 5, 8, 12, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[6, 9, 13, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[10, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Автор решения: Xander
→ Ссылка
Если я правильно понял вопрос, то вот, что вам нужно:
H = 11
W = 14
for k in range(0, H+W+1):
for i in range(0, min(k+1, H+1)):
y = i
x = k - i
if x > W:
continue
print(y, x)
Автор решения: yoloy
→ Ссылка
Объединил два предыдущих ответа в один и дописал поиск для остальных углов:
H = 11
W = 14
from pprint import pprint
table = [[0 for j in range(W + 1)] for i in range(H + 1)]
c = 1
for k in range(0, H+W+1):
for i in range(0, min(k+1, H+1)):
y = i
x = k - i
if x > W:
continue
table[y][x] = c
c+=1
pprint(table)
print()
table = [[0 for j in range(W + 1)] for i in range(H + 1)]
c = 1
for k in range(H+W+1,-1,-1 ):
for i in range(0, min(k+1, H+1)):
y = H-i
x = k - i
if x > W:
continue
table[y][x] = c
c+=1
pprint(table)
print()
table = [[0 for j in range(W + 1)] for i in range(H + 1)]
c = 1
for k in range(0, H+W+1):
for i in range(0, min(k+1, H+1)):
y = H-i
x = k - i
if x > W:
continue
table[y][x] = c
c+=1
pprint(table)
table = [[0 for j in range(W + 1)] for i in range(H + 1)]
c = 1
for k in range(H+W+1,-1,-1 ):
for i in range(0, min(k+1, H+1)):
y = i
x = k - i
if x > W:
continue
table[y][x] = c
c+=1
pprint(table)
print()