Статья Автор: Лебедев Дмитрий

Конспект 8. Двумерные массивы.

Оглавление

Часть 1 Часть 2 Задачи  
       
       

С++. Двумерные массивы. Часть 1

Рассмотрим работу с таблицами в языке C++. Под таблицей подразумевается набор из n×mn×m элементов, причём они структурированы в n строк, в каждой из которых по m элементов. К каждому элементу таблицы можно обратиться по номеру его строки и столбца.

Например, рассмотрим таблицу из 5 строк и 6 столбцов, заполненную числами от 0 до 29 по порядку:

0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
 

Тогда значение элемента таблицы, расположенного на второй строке в третьем столбце, — 15 (строки и столбцы таблицы нумеруются с нуля).

Для работы с таблицами в языке C++ используют двумерные массивы. Мы будем их реализовывать через уже знакомый контейнер vector. Создадим таблицу как «вектор векторов»:

vector<vector<int> > t(n, vector<int> (m, 0)); 

В результате появится таблица tt из nn строк и mm столбцов, заполненная нулями.

Заполним таблицу числами по порядку:

    int c = 0;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            t[i][j] = c;
            ++c;
        }
    }

Заметим, что можно заполнить таблицу, не используя переменную cc, с помощью формулы:

t[i][j] = i * m + j;

Выведем полученную таблицу на экран:

    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }

Задача о заполнении таблицы змейкой

Необходимо заполнить таблицу змейкой: строки с чётными номерами заполняем слева направо, а строки с нечётными — справа налево. Например, для таблицы размером 5×6 заполнение змейкой выглядит так:

0 1 2 3 4 5
11 10 9 8 7 6
12 13 14 15 16 17
23 22 21 20 19 18
24 25 26 27 28 29
 

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int> > t(n, vector<int> (m));
    int now = 0;
    for (int i = 0; i < t.size(); ++i){ // количество строк таблицы — t.size()
       if (i % 2 == 0){
          for (int j = 0;j < t[i].size(); ++j){ //количество элементов на i-й строке — t[i].size()
              t[i][j] = now;
              ++now;
          }
       }
       else{
          for (int j = t[i].size() - 1;j >= 0; --j){
              t[i][j] = now;
              ++now;
          }
       }
    }
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

С++. Двумерные массивы. Часть 2

Задача об обмене столбцов таблицы

Дана таблица размером n×mn×m. Необходимо поменять местами столбцы с номерами p и q.

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n, m, p, q;
    cin >> n >> m >> p >> q;
    vector<vector<int> > t(n, vector<int> (m));
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cin >> t[i][j];
        }
    }
    for (int i = 0; i < n; ++i){
        swap(t[i][p], t[i][q]);
    }
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cout << t[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
 

Задача о симметричной таблице

Необходимо проверить, симметрична ли квадратная таблица относительно главной диагонали. Пример симметричной таблицы:

1 2 3 4
2 3 1 2
3 1 5 9
4 2 9 0
 

Решение

#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    vector<vector<int> > t(n, vector<int> (n));
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < t[i].size(); ++j){
            cin >> t[i][j];
        }
    }
    bool issym = true;
    for (int i = 0; i < t.size(); ++i){
        for (int j = 0; j < i; ++j){
             if (t[i][j] != t[j][i]){
                issym = false;
             }
        }
    }
    if (issym){
        cout << "YES" << endl;
    }
    else{
        cout << "NO" << endl;
    }
    return 0;
}

Задачи для тренировки

1) Сверху вниз, слева направо

 
2) Шахматная доска  
3) Максимум  
4) Транспонировать квадратную матрицу  
5) Поменять местами две диагонали  
6) Кинотеатр  
7) Золото  

Печать