#include <stdio.h>
#include <math.h>
#define ARRSIZE 20
#define SQSIZE 51 // Любое нечётное число подойдёт

void transfer_coordinates(int abscissa[], int ordinate[]);
void double_bubble_sort(int arr_1[], int arr_2[], int order[]);
void print_field(int abscissa[], int ordinate[], int order[]);
void initialize_order_array(int order[]);

int main()
{
    double spiral_coefficient = 1.2; // r = k*(theta) 1.2

    double spiral_theta = 0;
    double polar_radius;

    int abscissa[ARRSIZE];
    int ordinate[ARRSIZE];

    int order[ARRSIZE];
    initialize_order_array(order);

    int i;

    for (i = 0; i < ARRSIZE; i++, spiral_theta += 1) {
        polar_radius = spiral_coefficient * spiral_theta;
        abscissa[i] = (int) round(polar_radius * cos(spiral_theta));
        ordinate[i] = (int) round(polar_radius * sin(spiral_theta));
    }

    print_field(abscissa, ordinate, order);
    return 0;
}

void double_bubble_sort(int arr_1[], int arr_2[], int order[])
{
    int i, j, dump;

    for (i = 0; i < ARRSIZE; i++) {
        for (j = 0; j < ARRSIZE - 1; j++) {
            if (arr_2[j + 1] < arr_2[j]) {
                dump = arr_1[j + 1], arr_1[j + 1] = arr_1[j], arr_1[j] = dump;
                dump = arr_2[j + 1], arr_2[j + 1] = arr_2[j], arr_2[j] = dump;
                dump = order[j + 1], order[j + 1] = order[j], order[j] = dump;
            }
        }
    }

    for (i = 0; i < ARRSIZE - 1; i++) {
        if (arr_2[i + 1] == arr_2[i] && arr_1[i + 1] < arr_1[i]) {
            dump = arr_1[i + 1], arr_1[i + 1] = arr_1[i], arr_1[i] = dump;
            dump = order[i + 1], order[i + 1] = order[i], order[i] = dump;
        }
    }
}
void print_field(int abscissa[], int ordinate[], int order[])
{
    transfer_coordinates(abscissa, ordinate);
    double_bubble_sort(abscissa, ordinate, order);

    int x, y, i;
    int half = (SQSIZE - 1) / 2;

    for (i = y = 0; y < SQSIZE; y++) {
        for (x = 0; x < SQSIZE; x++) {
            if (y == ordinate[i] && x == abscissa[i] && i < ARRSIZE) {
                printf(order[i] < 10 ? "%d " : "%d", order[i]);
                i++;
            } else if (x == half || y == half) {
                printf("x ");
            } else {
                printf("  ");
            }
        }
        printf("\n");
    }
}

void transfer_coordinates(int abscissa[], int ordinate[])
{
    int half = (SQSIZE - 1) / 2;
    int i;
    for (i = 0; i < ARRSIZE; i++) {
        abscissa[i] += half;
        ordinate[i] = half - ordinate[i];
    }
}

void initialize_order_array(int order[])
{
    int i;
    for (i = 0; i < ARRSIZE; i++) {
        order[i] = i;
    }
}
