LINUX.ORG.RU

pascal


0

0

Помогите решить задачу на pascal

Ввести число N и заполнить двухмерный массив размером NxN числами 1,2,3...N по спирали. Пример для N=3 получим: 1 2 3 8 9 4 7 6 5

Ответ на: комментарий от lutifer

Pascal'я не умею, на C пойдет? Неужели ручку и бумажку уже запретили?...

=== Cut ===
#include <stdio.h>
#include <stdlib.h>

int **m;
int N;

void read()
{
    int i;
    scanf("%d", &N);
    m = malloc(N*sizeof(int*));
    for (i = 0; i < N; ++i)
        m[i] = malloc(N*sizeof(int));
}

void solve()
{
    /* borders */
    int up = 0;
    int down = N;
    int left = -1;
    int right = N;

    int n = 1;
    int i = 0;
    int j = 0;
    while (1) {
        for ( ; j < right; ++j) /* go right */
            m[i][j] = n++;
        --j; ++i;
        if (n > N*N) return;
        for ( ; i < down; ++i) /* go down */
            m[i][j] = n++;
        --i; --j;
        if (n > N*N) return;
        for ( ; j > left; --j) /* go left */
            m[i][j] = n++;
        ++j; --i;
        if (n > N*N) return;
        for ( ; i > up; --i) /* go up */
            m[i][j] = n++;
        ++i; ++j;
        if (n > N*N) return;

        /* adjust borders */
        ++up;
        --down;
        ++left;
        --right;        
    }
}


void debug_print()
{
    int i, j;
    for (i = 0; i < N; ++i) {
        for (j = 0; j < N; ++j) 
            printf("%3d ", m[i][j]);
        putchar('\n');
    }
}

void destroy()
{
    int i;
    for (i = 0; i < N; ++i)
        free(m[i]);
    free(m);
}

int main()
{
    read();
    solve();
    debug_print();
    destroy();
}
=== Cut ===

dissident ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.