Задача
Условие
Задана матрица $n \cdot n$ — назовем ее $[1..n] \cdot [1..n]$ массивом. Для заданных $r$ и $c$ следует вывести $[1..r] \cdot [1..c]$ массив ($r$ строк и $c$ столбцов исходного массива).
Входные данные
Первая строка содержит число $n (1 \leq n \leq 100)$. Следующие строки содержат матрицу $n \cdot n$. Последняя строка содержит два числа $r$ и $c$ $(1 \leq r, c \leq n)$. Все числа в матрице не превышают по модулю $100$.
Выходные данные
Выведите матрицу $r \cdot c$.
Тесты
№ | Входные данные | Выходные данные |
1 | 4 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 3 2 |
1 2 5 6 9 1 |
2 | 5 18 25 34 44 -43 54 65 75 85 -32 95 15 25 35 -3 -4 15 -6 37 0 44 43 23 3 -12 4 3 |
18 25 34 54 65 75 95 15 25 -4 15 -6 |
3 | 2 0 -1 23 69 1 1 |
0 |
4 | 3 1 2 3 -4 -5 -6 7 8 9 3 1 |
1 -4 7 |
Решение
Для решения данной задачи необходимо ввести в массив все имеющиеся данные и вывести необходимые, соответственно заданным параметрам. Можно использовать как одномерные массивы, так и двухмерные.
В реализации с одномерными вводим все данные в массив $n \cdot n$, а затем выводим, используя вложенные циклы. Цикл проходит от $0$ до $r$ и от $(j \cdot n)$ — первого элемент необходимой строки до $(c + j \cdot n)$ — последнего элемента. В реализации с двумерными массивами заводим все данные в один массив и после выводим необходимые.
Код программы №1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> using namespace std; #define N 100 int main() { int n; cin >> n; int arr[N * N]; for (int i = 0; i < n * n; i++) { cin >> arr[i]; } int r, c; cin >> r >> c; for (int i = 0; i < c * r; i++) { cout << arr[((i / c) * n) + (i % c)] << ((1+i) % c == 0? "\n" : " "); } } |
Код программы №2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> using namespace std; #define N 100 int main() { int n, r, c; cin >> n; int arr[N][N]; for (int i = 0; i < n; i++) { for (int j = 0 ; j < n; j++) cin >> arr[i][j]; } cin >> r >> c; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { cout << arr[i][j] << " "; } cout << endl; } return 0; } |
Здравствуйте Елизавета, во втором коде вашей программы вы создаёте динамические массивы, но после их работы не освобождаете пространство после них. Исправьте пожалуйста.
В первом коде вы так же, средствами последней версии компилятора используете динамические массивы.
В рамках вашей задачи можно было бы использовать статические массивы длиной на максимальное допустимое количество элементов в матрице.
Также при реализации первого кода я бы посоветовал использовать частное и остаток от деления на заданные размеры, вместо дополнительного массива.
Допустим имеем массив Arr размером $n \times n$, тогда для вывода $r \times c$ элементов данного массива воспользуемся:
for (int i = 0; i < c * r; i++) cout << Arr[n * (i / r) + i % c];
Спасибо за комментарий. Исправила. Удалила ненужный дополнительный массив в первом коде, только воспользовалась другой формулой для вывода элементов.
Вы не поняли Ивана. Он предлагал решение без вложенных циклов:
Спасибо за комментарий. Исправила.