табуретка из трёхмерного массива

Нужно с помощью трёх массивов описать табуретку с перекладинами, элементы табуретки приравнять единице, а остальное нулями. Ну и вывод массива осуществлять послойно. А его размеры заранее вводятся пользователем.

Будет очень интересно посмотреть на решение, да и от источника с подробной информацией о трёхмерных массивов не отказываюсь


Ответы (3 шт):

Автор решения: TigerTV.ru

Табуретка с перекладинами:

int taburet[3][5][3] = {
    {
        {1, 1, 1},
        {1, 0, 1},
        {1, 1, 1},
        {1, 0, 1},
        {1, 0, 1},
    },
    {
        {1, 1, 1},
        {0, 0, 0},
        {1, 0, 1},
        {0, 0, 0},
        {0, 0, 0},
    },
    {
        {1, 1, 1},
        {1, 0, 1},
        {1, 1, 1},
        {1, 0, 1},
        {1, 0, 1},
    },
};
→ Ссылка
Автор решения: MiniMax

Решение. Можно добавить проверок вводимых размеров в зависимости от условия. Тут допустима табуретка любых размеров, включая высоту и ширину 1.

#include <stdio.h>
#include <string.h>

void print_3d_arr(size_t z, size_t y, size_t x, int arr[z][y][x]) {
    for(size_t i = 0; i < z; i++) {
        for(size_t j = 0; j < y; j++) {
            for(size_t k = 0; k < x; k++) {
                printf("%d ", arr[i][j][k]);
            }
            puts("");
        }
        puts("");
    }
}

void make_horz_line(size_t hght, size_t wdth, int frame[hght][wdth], size_t n) {
    for(size_t y = 0; y < hght; y++) {
        for(size_t x = 0; x < wdth; x++) {
            if (y == n) {
                frame[y][x] = 1;
            }
        }
    }
}

void make_vert_line(size_t hght, size_t wdth, int frame[hght][wdth], size_t n) {
    for(size_t y = 0; y < hght; y++) {
        for(size_t x = 0; x < wdth; x++) {
            if (x == n) {
                frame[y][x] = 1;
            }
        }
    }
}

void make_side(size_t hght, size_t wdth, int frame[hght][wdth]) {
    make_horz_line(hght, wdth, frame, 0);
    make_horz_line(hght, wdth, frame, hght / 2);

    make_vert_line(hght, wdth, frame, 0);
    make_vert_line(hght, wdth, frame, wdth - 1);
}

void make_middle(size_t hght, size_t wdth, int frame[hght][wdth]) {
    make_horz_line(hght, wdth, frame, 0);
    frame[hght / 2][0] = 1;
    frame[hght / 2][wdth - 1] = 1;
}

int main() {
    size_t wdth, hght, frames_num;

    puts("Enter height:");
    scanf("%zu", &hght);

    puts("Enter width:");
    scanf("%zu", &wdth);

    frames_num = wdth;
    int model[frames_num][hght][wdth];
    memset(model, 0, frames_num * hght * wdth * sizeof(model[0][0][0]));

    make_side(hght, wdth, model[0]);
    for(size_t i = 1; i < frames_num - 1; i++) {
        make_middle(hght, wdth, model[i]);
    }
    make_side(hght, wdth, model[frames_num - 1]);

    print_3d_arr(frames_num, hght, wdth, model);

    return 0;
}

Тест

$ gcc tabouret.c
$ echo -n 5 4 | ./a.out

Enter height:
Enter width:
1 1 1 1 
1 0 0 1 
1 1 1 1 
1 0 0 1 
1 0 0 1 

1 1 1 1 
0 0 0 0 
1 0 0 1 
0 0 0 0 
0 0 0 0 

1 1 1 1 
0 0 0 0 
1 0 0 1 
0 0 0 0 
0 0 0 0 

1 1 1 1 
1 0 0 1 
1 1 1 1 
1 0 0 1 
1 0 0 1 
→ Ссылка
Автор решения: Mikhailo

"Срезы" снизу вверх, сиденье — последний двумерный массив.

const int ZSIZE = 6, YSIZE = 4, XSIZE = 4;

int stool[ZSIZE][YSIZE][XSIZE] =

{
    {
        { 1, 0, 0, 1 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 1, 0, 0, 1 },
    },
    {
        { 1, 0, 0, 1 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 1, 0, 0, 1 },
    },
    {
        { 1, 1, 1, 1 },
        { 1, 0, 0, 1 },
        { 1, 0, 0, 1 },
        { 1, 1, 1, 1 },
    },
    {
        { 1, 0, 0, 1 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 1, 0, 0, 1 },
    },
    {
        { 1, 0, 0, 1 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 1, 0, 0, 1 },
    },
    {
        { 1, 1, 1, 1 },
        { 1, 1, 1, 1 },
        { 1, 1, 1, 1 },
        { 1, 1, 1, 1 },
    },
};
→ Ссылка