Упрощение алгоритма для диагонального поиска

Задача простая донельзя, но я что-то застрял. Имеется поле 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()
→ Ссылка