Задача на трёхмерный массив с

Детские пластиковые кубики трех цветов сложены в прямоугольный параллелепипед размером MxNxP кубиков. Определить, найдется ли в этом параллелепипеде хотя бы один слой толщиной в один кубик, расположенный параллельно какой-нибудь грани параллелепипеда, сложенный из кубиков одного цвета. как мне проверить плоскость массива?

на c

#include <stdio.h>

int main() {
    int M, N, P;
    int plld[10][10][10];
    int color[3] = {0};
    
    printf("Введите размеры параллелепипеда (M N P): ");
    scanf("%d %d %d", &M, &N, &P);
    
    printf("Введите цвета кубиков (0 - красный, 1 - зеленый, 2 - синий):\n");
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            for (int k = 0; k < P; k++) {
                scanf("%d", &plld[i][j][k]);
                color[plld[i][j][k]]++;
            }
        }
    }
    
    for (int i = 0; i < 3; i++) {
        if (color[i] >= N * P || color[i] >= M * P || color[i] >= M * N) {
            printf("Слой из кубиков одного цвета существует!\n");
            return 0;
        }
    }
    
    printf("Слой из кубиков одного цвета не существует.\n");
    
    return 0;
}

Я решил эту задачу и оставляю ответ выше.


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

Автор решения: LazyHat

Я бы начал с реализации трехмерного массива подобного этому, для того чтобы было проще оперировать плоскостями и структурой в целом:

template <typename T, std::size_t X, std::size_t Y, std::size_t Z>
class Array3
{
    typedef std::array<std::array<std::array<T, Z>, Y>, X> ArrayXYZ;
    typedef std::array<std::array<T, Z>, Y> ArrayYZ;
    typedef std::array<std::array<T, Z>, X> ArrayXZ;
    typedef std::array<std::array<T, Y>, X> ArrayXY;
    ArrayXYZ mArray;

public:
    Array3() {}

    ArrayYZ getPlaneYZ(std::size_t x)
    {
        ArrayYZ result = mArray[x];
        return result;
    }

    ArrayXZ getPlaneXZ(std::size_t y)
    {
        ArrayXZ result;
        for (std::size_t x = 0; x < X; x++)
            for (std::size_t z = 0; z < Z; z++)
                result[x][z] = mArray[x][y][z];
        return result;
    }

    ArrayXY getPlaneXY(std::size_t z)
    {
        ArrayXZ result;
        for (std::size_t x = 0; x < X; x++)
            for (std::size_t y = 0; y < Y; y++)
                result[x][y] = mArray[x][y][z];
        return result;
    }
};

А дальше просто, проходишься по всем плоскостям и сравниваешь в них элементы между собой.

→ Ссылка