#include<stdio.h>

#define TOP_WIDTH (5)           // ← 最上行の数字個数

#define ALL_N     (TOP_WIDTH * (TOP_WIDTH + 1) / 2)

// 並べ替え結果処理
void kekka_shori(int *d, int len)
{
    int i, j, tmp[2][TOP_WIDTH], *p[2], *swap, ans[ALL_N], *pa = &ans[0];
    unsigned long b = 0x0;

    for (i = 0; i < TOP_WIDTH; i++) {
        *pa++ = tmp[0][i] = d[i];
    }
    p[0] = &tmp[0][0];
    p[1] = &tmp[1][0];
    for (j = TOP_WIDTH; j >= 2; j--) {
        for (i = 0; i < j; i++) {
            b |= 1 << (p[0][i] - 1);
        }
        for (i = 0; i < j - 1; i++) {
            p[1][i] = p[0][i] - p[0][i + 1];
            if (p[1][i] < 0) {
                p[1][i] = -p[1][i];
            }
            *pa++ = p[1][i];
        }
        // swap
        swap = p[0];
        p[0] = p[1];
        p[1] = swap;
    }
    b |= 1 << (p[0][0] - 1);

    if (b == ~(0xFFFFFFFF << ALL_N)) {
        pa = &ans[0];
        printf("---\n");
        for (j = TOP_WIDTH; j >= 1; j--) {
            printf("%*s", (TOP_WIDTH - j) * 2, "");
            for (i = 0; i < j; i++) {
                printf("%2d  ", *pa++);
            }
            printf("\n");
        }
    }
}

// 並べ替える
//  (len個の配列の右n個を左にスライドして再帰)
void narabe(int *d, int len, int n)
{
    int i, j;
    int tmp;

    if (n <= (ALL_N - TOP_WIDTH)) {
        kekka_shori(d, len);
        return;
    }
    for (j = 0; j < n; j++) {
        narabe(d, len, n - 1);
        tmp = d[len - n];
        for (i = 0; i < n - 1; i++) {
            d[len - n + i] = d[len - n + i + 1];
        }
        d[len - n + i] = tmp;
    }
}

int main()
{
    int d[ALL_N];
    int i;

    if (ALL_N > 32) {
        fprintf(stderr, "現状、総数32個までしか計算出来ないので %d個は無理です\n", ALL_N);
        return 1;
    }
    for (i = 0; i < ALL_N; i++) {
        d[i] = i + 1;
    }

    narabe(d, ALL_N, ALL_N);
    printf("\n");
    return 0;
}