Двухмерные массивы на C++
Михаил Попов 09.01.2016 15:45 C++ , Алгоритмы нет комментариевПодоспела очередная порция задач по информатике для школьников. На этот раз рассмотрим работу с двухмерными массивами на C++. Эти задачи достаточно интересные. И большая часть из них мне понравилась.
Задача №1
Найдите индексы первого вхождения максимального элемента.
Формат входных данных
Программа получает на вход размеры массива n и m, затем n строк по m чисел в каждой. n и m не превышают 100.
Формат выходных данных
Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.
Sample Input: 3 4 0 3 2 4 2 3 5 5 5 1 2 3 Sample Output: 1 2
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[100][100];
// чтение
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int max = a[0][0], max_i = 0, max_j = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] > max) {
max = a[i][j];
max_i = i;
max_j = j;
}
}
}
cout << max_i << " " << max_j;
return 0;
}
Задача №2
Дано нечетное число n, не превосходящее 15. Создайте двумерный массив из n×n элементов, заполнив его символами "." (каждый элемент массива является строкой из одного символа). Затем заполните символами "*" среднюю строку массива, средний столбец массива, главную диагональ и побочную диагональ. В результате "*" в массиве должны образовывать изображение звездочки. Выведите полученный массив на экран, разделяя элементы массива пробелами.
Sample Input: 5 Sample Output: * . * . * . * * * . * * * * * . * * * . * . * . *
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int a[15][15];
// обработка
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j || i == n - 1 - j || i == n / 2 || j == n / 2) a[i][j] = 1;
else a[i][j] = 0;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 0) cout << "." << " ";
else cout << "*" << " ";
}
cout << endl;
}
return 0;
}
Задача №3
Дано число n, не превышающее 100. Создайте массив размером n×n и заполните его по следующему правилу. На главной диагонали должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1. На следующих двух диагоналях числа 2, и т.д.
Sample Input: 5 Sample Output: 0 1 2 3 4 1 0 1 2 3 2 1 0 1 2 3 2 1 0 1 4 3 2 1 0
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
int a[100][100];
// обработка
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = (int) abs(i - j);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
Задача №4
Дан двумерный массив и два числа: i и j. Поменяйте в массиве столбцы с номерами i и j.
Формат входных данных
Программа получает на вход размеры массива n и m, не превосходящие 100, затем элементы массива, затем числа i и j.
Формат выходных данных
Выведите результат.
Sample Input: 3 4 11 12 13 14 21 22 23 24 31 32 33 34 0 1 Sample Output: 12 11 13 14 22 21 23 24 32 31 33 34
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, m, x, y, temp;
cin >> n >> m;
int a[n][m];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
cin >> x >> y;
// обработка
for (int i = 0; i < n; i++) {
temp = a[i][x];
a[i][x] = a[i][y];
a[i][y] = temp;
}
// вывод
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
Задача №5
Дано число n, не превосходящее 10, и массив размером n × n. Проверьте, является ли этот массив симметричным относительно главной диагонали. Выведите слово “YES”, если массив симметричный, и слово “NO” в противном случае.
Sample Input: 3 0 1 2 1 2 3 2 3 4 Sample Output: YES
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
bool symmetric;
cin >> n;
int a[10][10];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
// обработка
symmetric = true;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] != a[j][i]) symmetric = false;
}
}
// вывод
if (symmetric) cout << "YES";
else cout << "NO";
return 0;
}
Задача №6
Дан квадратный двумерный массив размером n × n и число k. Выведите элементы k-й по счету диагонали ниже главной диагонали (т.е. если k = 1, то нужно вывести элементы первой диагонали, лежащей ниже главной, если k = 2, то второй диагонали и т.д.).
Значение k может быть отрицательным, например, если k = −1, то нужно вывести значение первой диагонали лежащей выше главной. Если k = 0, то нужно вывести элементы главной диагонали.
Программа получает на вход число n, не превосходящие 10, затем массив размером n × n, затем число k.
Sample Input 1: 4 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 Sample Output 1: 5 1 6 Sample Input 2: 4 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 -2 Sample Output 2: 3 8
#include <iostream>
using namespace std;
int main() {
int n, k;
cin >> n;
int a[n][n];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
cin >> k;
// обработка и вывод
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i - j - k == 0) cout << a[i][j] << " ";
}
}
return 0;
}
Задача №7
Дан двумерный массив размером n×m (n и m не превосходят 1000). Симметричный ему относительно главной диагонали массив называется транспонированным к данному. Он имеет размеры m×n: строки исходного массива становятся столбцами транспонированного, столбцы исходного массива становятся строками транспонированного.
Для данного массива постройте транспонированный массив и выведите его на экран.
Sample Input: 3 4 11 12 13 14 21 22 23 24 31 32 33 34 Sample Output: 11 21 31 12 22 32 13 23 33 14 24 34
#include <iostream>
using namespace std;
int main() {
int n, m, x, y, temp;
cin >> n >> m;
int a[n][m];
int b[m][n];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
// обработка
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
b[j][i] = a[i][j];
}
}
// вывод
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
Задача №8
В кинотеатре n рядов по m мест в каждом (n и m не превосходят 20). В двумерном массиве хранится информация о проданных билетах, число 1 означает, что билет на данное место уже продан, число 0 означает, что место свободно. Поступил запрос на продажу k билетов на соседние места в одном ряду. Определите, можно ли выполнить такой запрос.
Формат входных данных
Программа получает на вход числа n и m. Далее идет n строк, содержащих m чисел (0 или 1), разделенных пробелами. Затем дано число k.
Формат выходных данных
Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест. Если таких рядов несколько, то выведите номер наименьшего подходящего ряда. Если подходящего ряда нет, выведите число 0.
Sample Input: 3 4 0 1 0 1 1 0 0 1 1 1 1 1 2 Sample Output: 2
#include <iostream>
using namespace std;
int main() {
int n, m, k, r = 0;
cin >> n >> m;
int a[n][m];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
cin >> k;
// обработка
for (int i = 0; i < n; i++) {
int near_free = 0;
for (int j = 0; j < m; j++) {
if (a[i][j] == 0) {
near_free++;
if (near_free == k) {
r = i + 1;
break;
}
}
else near_free = 0;
}
if (near_free == k) break;
}
// вывод
cout << r;
return 0;
}
Задача №9
Дан прямоугольный массив размером n×m. Поверните его на 90 градусов по часовой стрелке, записав результат в новый массив размером m×n.
Формат входных данных
Вводятся два числа n и m, не превосходящие 100, затем массив размером n×m.
Формат выходных данных
Выведите получившийся массив. Числа при выводе разделяйте одним пробелом.
Sample Input: 3 4 11 12 13 14 21 22 23 24 31 32 33 34 Sample Output: 31 21 11 32 22 12 33 23 13 34 24 14
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[n][m];
int b[m][n];
// заполнение
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
// обработка
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
b[j][n - 1 - i] = a[i][j];
}
}
// вывод
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
Задача №10
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “змейкой”, как показано в примере.
Формат входных данных
Вводятся два числа n и m, каждое из которых не превышает 20.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Sample Input: 3 5 Sample Output: 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15
#include <iostream>
using namespace std;
int main() {
int n, m, c = 0;
cin >> n >> m;
int a[n][m];
// обработка
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
c++;
if (i%2 == 0) a[i][j] = c;
else a[i][m - j - 1] = c;
}
}
// вывод
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] % 10 == a[i][j]) cout << " ";
else if (a[i][j] % 100 == a[i][j]) cout << " ";
else if (a[i][j] % 1000 == a[i][j]) cout << " ";
cout << a[i][j];
}
cout << endl;
}
return 0;
}
Задача №11
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “диагоналями”, как показано в примере.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Sample Input: 3 5 Sample Output: 1 2 4 7 10 3 5 8 11 13 6 9 12 14 15
#include <iostream>
using namespace std;
int main() {
int n, m, pos = 0, row = 0;
cin >> n >> m;
int a[n][m];
// обработка
int start_row = 0;
int number = 1;
for (int min_row = 0; min_row < n; min_row++) {
if (min_row > 0) start_row = pos - 1;
else start_row = 0;
for (pos = start_row; pos < m; pos++) {
row = min_row;
for (int col = pos; col >= 0; col--) {
if (row < n) {
a[row][col] = number;
number++;
row++;
}
else break;
}
}
}
// вывод
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] % 10 == a[i][j]) cout << " ";
else if (a[i][j] % 100 == a[i][j]) cout << " ";
else if (a[i][j] % 1000 == a[i][j]) cout << " ";
cout << a[i][j];
}
cout << endl;
}
return 0;
}
Задача №12
Даны числа n и m. Заполните массив размером n × m в шахматном порядке: клетки одного цвета заполнены нулями, а другого цвета - заполнены числами натурального ряда сверху вниз, слева направо. В левом верхнем углу записано число 1.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Sample Input: 3 5 Sample Output: 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8
#include <iostream>
using namespace std;
int main() {
int n, m, sm;
cin >> n >> m;
int a[n][m];
// обработка
int number = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
a[i][j] = 0;
}
}
for (int i = 0; i < n; i++) {
if (i % 2 == 1) sm = 1;
else sm = 0;
for (int j = sm; j < m; j++) {
a[i][j] = number;
number++;
j++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] % 10 == a[i][j]) cout << " ";
else if (a[i][j] % 100 == a[i][j]) cout << " ";
else if (a[i][j] % 1000 == a[i][j]) cout << " ";
cout << a[i][j];
}
cout << endl;
}
return 0;
}
Задача №13
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке, как показано в примере.
Формат входных данных
Вводятся два числа n и m, не превышающие 100.
Формат выходных данных
Выведите полученный массив, отводя на вывод каждого элемента ровно 4 символа.
Sample Input: 4 5 Sample Output: 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7 12 11 10 9 8
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int a[n+2][m+2];
for (int i = 0; i <= n + 1; i++) {
for (int j = 0; j <= m + 1; j++) {
a[i][j] = -1;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = 0;
}
}
int num = 0, row = 1, col = 0;
while (num < n * m) {
while (a[row][col + 1] == 0) {
col++;
num++;
a[row][col] = num;
}
while (a[row + 1][col] == 0) {
row++;
num++;
a[row][col] = num;
}
while (a[row][col - 1] == 0) {
col--;
num++;
a[row][col] = num;
}
while (a[row - 1][col] == 0) {
row--;
num++;
a[row][col] = num;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (a[i][j] % 10 == a[i][j]) cout << " ";
else if (a[i][j] % 100 == a[i][j]) cout << " ";
else if (a[i][j] % 1000 == a[i][j]) cout << " ";
cout << a[i][j];
}
cout << endl;
}
return 0;
}
Функции и рекурсия в C++ | Работа с действительными числами на C++ |
0 0 |