Двухмерные массивы на C++

Михаил Попов    09.01.2016 15:45    C++ , Алгоритмы     нет комментариев

Матрицы на 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

blog comments powered by Disqus