После тщательного укромного зануда я придумал следующее:
#include <stdio.h>
void print_spiral(int size)
{
for (int y = 0; y < size; ++y)
{
for (int x = 0; x < size; ++x)
{
// reflect (x, y) to the top left quadrant as (a, b)
int a = x;
int b = y;
if (a >= size / 2) a = size - a - 1;
if (b >= size / 2) b = size - b - 1;
// calculate distance from center ring
int u = abs(a - size / 2);
int v = abs(b - size / 2);
int d = u > v ? u : v;
int L = size / 2;
if (size % 4 == 0) L--;
// fix the top-left-to-bottom-right diagonal
if (y == x + 1 && y <= L) d++;
printf((d + size / 2) % 2 == 0 ? "X" : " ");
}
printf("\n");
}
}
Как уже упоминалось, может быть более интуитивно понятно выделить массив, представляющий сетку, и нарисоватьспираль в массив (внутри которого вы можете свободно перемещаться), затем распечатайте массив.Но в этом решении используется память O (1).
Его почти наверняка можно немного оптимизировать и упростить, но я «оставлю это как упражнение для читателя», поскольку я уже потратил слишком многовремя на это; -)
Обновление
Я не собираюсь тратить на это больше времени, но у меня была идея для второй попытки, что может результат в более простом коде.Если вы проверяете вывод во все больших размерах, появляется шаблон:
В каждом квадранте шаблон является регулярным и может быть легко закодирован.Я думаю, вам просто нужно тщательно классифицировать ( x , y ) координаты в один из четырех квадрантов, а затем применить соответствующий шаблон.