Если вы, как и я, устрашились фундаментального двухчастного трактата коллеги@Orazbek_B, возможно вас заинтересует это крохотное эссе. Сперва – код на питоне:
n, m = 5, 8 # высота и ширина матрицы
def draw(title, f):
print(f"\n{title:-^{m * 3 - 1}}")
res = [""] * (n * m)
for i, j in enumerate(sorted(range(n * m), key=lambda i: f(i // m, i % m))):
res[j] = f"{i:>02}"
for i in range(0, n * m, m):
print(*res[i:i + m])
draw("horizontal", lambda y, x: (y, -x if y % 2 else x))
draw("diagonal" , lambda y, x: (y + x, x if (y + x) % 2 else -x))
Результатом выполнения этого кода будут две аккуратные змейки:
------horizontal-------
00 01 02 03 04 05 06 07
15 14 13 12 11 10 09 08
16 17 18 19 20 21 22 23
31 30 29 28 27 26 25 24
32 33 34 35 36 37 38 39
-------diagonal--------
00 02 03 09 10 19 20 29
01 04 08 11 18 21 28 30
05 07 12 17 22 27 31 36
06 13 16 23 26 32 35 37
14 15 24 25 33 34 38 39
В алгоритме ничего сложного: каждой его ячейке ставим в соответствие такой ключ, чтобы, будучи отсортированы по ключам, ячейки заполнялись бы в нужном порядке.
Наши матрицы не злобные, они мягкие и пушистые. Бонус: они не обязательно квадратные. Можно отрисовать и спиральку, хоть прямоугольную, хоть ромбическую, хоть округлую, можно залить не прямоугольник, а фигуру произвольной формы – было бы желание.
Извинити, что так коротенько: о чём говорить, когда говорить не о чем ?