Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

С++. Помогите пожалуйста)

Октавиан Негруша Ученик (70), закрыт 2 года назад
Кубики

Условие

ООО «Симптотика» собирается наладить выпуск обучающих игр для детей младшего дошкольного возраста. Одной из придуманных игр был набор кубиков, из которых можно было собирать различные фигуры. Кубики упаковывались в коробку размером N×N×1 кубиков.

Однако, многочисленные маркетинговые исследования показали, что детям неинтересно просто собирать различные фигурки. Гораздо интереснее складывать некоторый набор кубиков на дно коробки в столбики, а после этого переворачивать коробку на 90 градусов по часовой стрелке и смотреть, как именно меняется их расположение. Будем для простоты считать, что коробка поворачивается мгновенно, после чего все кубики падают на дно. На следующем рисунке продемонстрировано, как выглядит расположение кубиков в коробке до и после поворота на 90 градусов.

----------Картинка внизу находится ---------

Разумеется, многим детям становится интересно, как будет выглядеть расположение кубиков после K поворотов в том же направлении. Требуется написать программу, которая вычисляет итоговое положение кубиков в коробке после K поворотов.

Формат входных данных

Сначала вводятся целые числа N
и K (1≤N≤10, 0≤K≤109). После этого, во второй строке вводятся N неотрицательных чисел, не превышающих N. i-е число обозначает количество кубиков в столбце под номером i.

Формат выходных данных

Необходимо вывести N чисел через пробел, i-ое из которых обозначает количество чисел в i-ом столбце в полученном после K поворотов расположении кубиков.

входные данные

5 1
1 3 4 0 1

выходные данные

4 2 2 1 0

Лучший ответ
Dmitry Просветленный (22376) 2 года назад
#include <iostream>

void print(const int* begin, const int* end) {
    for (; begin < end; ++begin)
        std::cout << *begin << ' ';
}

void count(const int* arr, int size, int* writeTo) {
    for (int i = 0; i < size; ++i) {
        writeTo[i] = 0;
        for (int j = 0; j < size; ++j)
            if (arr[j] > i)
                ++writeTo[i];
    }
}

int main() {
    constexpr int maxSize = 10;
    int arr1[maxSize], n, k;
    std::cin >> n >> k;
    for (int i = 0; i < n; ++i)
        std::cin >> arr1[i];
    if (n < 2 || k == 0) {
        print(arr1, arr1 + n);
        return 0;
    }
    int arr2[maxSize];
    count(arr1, n, arr2);
    if (k % 2 != 0)
        print(arr2, arr2 + n);
    else {
        count(arr2, n, arr1);
        print(arr1, arr1 + n);
    }
    return 0;
}
Остальные ответы
Peer-2-Peer Мудрец (16172) 2 года назад
ДА ЭТО ЖЕ КАЛЕЙДОСКОП ИЗ КУБИКОВ!!!

Решение лучше разбить на 2 стадии: вращение матрицы до остановки и упаковку столбцов матрицы. Внимательно читайте условие задачи, из него следует, что на этапе вращения кубики не падают, они падают после остановки.

Важная закономерность: каждые 4 единичных поворота приводят матрицу к исходному виду, поэтому достаточно вместо K взять остаток от деления K на 4 ( K %= 4; ).
Октавиан НегрушаУченик (70) 2 года назад
Ты можешь показать код пж?
Peer-2-Peer Мудрец (16172) Октавиан Негруша, к сожалению у меня мало времени, работа.
Peer-2-PeerМудрец (16172) 2 года назад
У решения этой задачи всего 4 альтернативные ветви, причём, попарно зеркальные!

В двух — считать количество кубиков по столбцам, в двух — по строкам.
В двух — перечислять от начала до конца, ещё в двух — от конца до начала.
Все 4 варианта получаются попарным комбинированием вышеуказанного.
Peer-2-PeerМудрец (16172) 2 года назад
Не требуется учитывать тот факт, что кубики падают, ведь их количество в каждом столбце не меняется!!! Просто подсчитайте это количество отдельно по столбцам.
Октавиан Негруша Ученик (70) Peer-2-Peer, ты сможешь мне помочь?
Октавиан НегрушаУченик (70) 2 года назад
Мне нужен код)))
Peer-2-PeerМудрец (16172) 2 года назад
◉ Спешу предупредить тех, кто захочет решать эту задачу.

У ЗАДАЧИ ЕСТЬ ИЗЪЯН, КОТОРЫЙ Я НЕ ЗАМЕТИЛ СРАЗУ!!!

 ☀  В условии задачи НИГДЕ не обозначено, что изначально коробка ставится на торец (т. е. боковую сторону), то есть так, что при взгляде не сверху вниз, а фронтально можно увидеть квадрат N × N, а глубина коробки совпадает с направлением взгляда.

→Что же получается? Если изначально коробка лежит, то кубики в столбцах могут располагаться как угодно. В таком случае однозначное решение возможно, если K чётное, то есть коробка переворачивается так, что столбцы переходят в столбцы, и не имеет значения, как изначально кубики располагались в каждом столбце. А если K нечётное (то есть строки переходят в столбцы), то информации явно недостаточно, ведь каждый кубик, перейдя ↓
Peer-2-Peer Мудрец (16172) ↑ из столбца в строку может оказаться в любом столбце!!! Однозначного решения нет!!! →Однако, иллюстрация к задаче подсказывает, что квадратная сторона коробки изначально вертикальна, следовательно, все кубики изначально прижаты силой тяжести к торцу коробки, который в формулировке условия задачи и назван ДНОМ. Только в такой интерпретации условия решение может быть однозначным.
Peer-2-PeerМудрец (16172) 2 года назад
Если K — чётное, то достаточно воспроизвести вторую строку входных данных либо слева направо, либо справа налево в зависимости от того, делится ли K на 4 нацело.
Peer-2-PeerМудрец (16172) 2 года назад
Вот в случае нечётного K решение будет посложнее! Можно решать задачу одним из двух способов: наглядным моделированием — с помощью двоичной матрицы N × N, в которой каждому кубику соответствует единица, а отсутствие кубика выражается нулём, и аналитическим — непосредственным пересчётом массива столбцов в массив строк.
Похожие вопросы