Модуль 1.8 (Двумерные массивы) в данном модуле будет изучен двумерные массивы иногда их также называют «матрицами».
Ниже представлены примеры задач с решением на C++ на тему Двумерные массивы.
Найдите индексы первого вхождения максимального элемента.
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int main() {
int n, m, x = 0, y = 0, a, am;
cin >> n >> m;
n *= m;
cin >> am;
for (int i = 1; i < n; i++) {
cin >> a;
if (am < a) {
am = a;
x = i / m;
y = i % m;
}
}
cout << x << " " << y;
}
Дано нечетное число n, не превосходящее 15. Создайте двумерный массив из n×n элементов, заполнив его символами «.» (каждый элемент массива является строкой из одного символа). Затем заполните символами «*» среднюю строку массива, средний столбец массива, главную диагональ и побочную диагональ. В результате «*» в массиве должны образовывать изображение звездочки. Выведите полученный массив на экран, разделяя элементы массива пробелами.
#include <iostream>
using namespace std;
int main() {
int a[15][15];
int N;
cin >> N;
for(int y=0; y<N; y++)
{
for(int x=0; x<N; x++)
{
if(x==y || x==N/2 || y==N/2 || x==N-y-1)
{
cout << "* ";
}
else
{
cout <<". ";
}
}
cout << endl;
}
return 0;
}
Дано число n, не превышающее 100. Создайте массив размером n×n и заполните его по следующему правилу. На главной диагонали должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1. На следующих двух диагоналях числа 2, и т.д. Выведите полученный массив на экран, разделяя элементы массива пробелами.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < n * n; i++) {
if (!(i % n))
cout << endl;
cout << abs(i / n - i % n) << " ";
}
}
Дан двумерный массив и два числа: i и j. Поменяйте в массиве столбцы с номерами i и j
#include <iostream>
using namespace std;
int main()
{
int n, m, first, second;
cin >> n >> m;
int **arr = new int*[n];
for (int i = 0; i < n; arr[i] = new int[m], i++);
for (int i = 0; i < n; i++)for (int j = 0; j < m; cin >> arr[i][j], j++);
cin >> first >> second;
for (int i = 0; i < n; swap(arr[i][first], arr[i][second]), i++);
for (int i = 0; i < n; cout << endl, i++)for (int j = 0; j < m; cout << arr[i][j]<<" ", j++);
return 0;
}
Дано число n, не превосходящее 10, и массив размером n × n. Проверьте, является ли этот массив симметричным относительно главной диагонали. Выведите слово “YES”, если массив симметричный, и слово “NO” в противном случае.
#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;
}
Дан квадратный двумерный массив размером n × n и число k. Выведите элементы k-й по счету диагонали ниже главной диагонали (т.е. если k = 1, то нужно вывести элементы первой диагонали, лежащей ниже главной, если k = 2, то второй диагонали и т.д.).
Значение k может быть отрицательным, например, если k = −1, то нужно вывести значение первой диагонали лежащей выше главной. Если k = 0, то нужно вывести элементы главной диагонали.
Программа получает на вход число n, не превосходящие 10, затем массив размером n × n, затем число k.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, m, x, y, temp;
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 >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if ((i-j)==m){
cout << a[i][j]<< " ";
}
}
}
return 0;
}
Дан двумерный массив размером n×m (n и m не превосходят 1000). Симметричный ему относительно главной диагонали массив называется транспонированным к данному. Он имеет размеры m×n: строки исходного массива становятся столбцами транспонированного, столбцы исходного массива становятся строками транспонированного.
Для данного массива постройте транспонированный массив и выведите его на экран.
#include <iostream>
using namespace std;
int main() {
int n, m, temp;
cin >> n >> m;
if(m>n)
temp = m;
else
temp = n;
int a[temp][temp];
for(int y=0; y<n; y++)
{
for(int x=0; x<m; x++)
{
cin >> a[y][x];
}
}
if(m>n)
{
for(int y=0; y<n; y++)
{
for(int x=y; x<m; x++)
{
temp = a[x][y];
a[x][y] = a[y][x];
a[y][x] = temp;
}
}
}
else
{
for(int x=0; x<m; x++)
{
for(int y=x; y<n; y++)
{
temp = a[x][y];
a[x][y] = a[y][x];
a[y][x] = temp;
}
}
}
for(int y=0; y<m; y++)
{
for(int x=0; x<n; x++)
{
cout << a[y][x] << " ";
}
cout << endl;
}
return 0;
}
В кинотеатре n рядов по m мест в каждом (n и m не превосходят 20). В двумерном массиве хранится информация о проданных билетах, число 1 означает, что билет на данное место уже продан, число 0 означает, что место свободно. Поступил запрос на продажу k билетов на соседние места в одном ряду. Определите, можно ли выполнить такой запрос.
#include <iostream>
using namespace std;
int main() {
const int size = 20;
int n, m;
int arr[size][size];
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> arr[i][j];
}
}
int k;
cin >> k;
int cnt = 0;
int row = 0;
bool query = false;
for (int i = 0; i < n && !query; ++i) {
for (int j = 0; j < m && !query; ++j) {
if (arr[i][j] == 0) {
++cnt;
}
else {
cnt = 0;
}
if (cnt == k) {
query = true;
row = i + 1;
}
}
cnt = 0;
}
cout << row;
return 0;
}
Дан прямоугольный массив размером n×m. Поверните его на 90 градусов по часовой стрелке, записав результат в новый массив размером m×n.
#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];
}
}
for (int j = 0; j < m; j++) {
for (int i = n-1; i >= 0; i--) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “змейкой”, как показано в примере.
#include <iostream>
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int i, j, k, n, m, a[30][30];
cin >> n >> m;
k = 1;
//for (i = 0; i != n; i++) {
// for (j = 0; j != m; j++) {
// cin >> a[i][j];
// }
//}
for (i = 0; i != n; i++) {
if (i % 2 == 0) {
for (j = 0; j != m; j++) {
a[i][j] = k;
k++;
}
}
else {
for (j = m - 1; j >= 0; j--) {
a[i][j] = k;
k++;
}
}
}
for (i = 0; i != n; i++) {
for (j = 0; j != m; j++) {
cout << setw(4) << a[i][j];
}
cout << endl;
}
return 0;
}
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m “диагоналями”, как показано в примере.
#include <iostream>
using namespace std;
int main()
{
int n, m, l = 1;
cin >> n >> m;
int a[n][m];
for(int x = 0; x < n + m; x++)
{
for(int y = 0; y < n; y++)
{
if(x-y>=0 && x-y<m)
{
a[y][x-y] = l;
l++;
}
}
}
//вывод
cout<<" ";
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
std::cout.width(4); std::cout << a[i-1][j-1];}
cout<<endl;}
return 0;
}
Даны числа n и m. Заполните массив размером n × m в шахматном порядке: клетки одного цвета заполнены нулями, а другого цвета — заполнены числами натурального ряда сверху вниз, слева направо. В левом верхнем углу записано число 1.
#include <iostream>
using namespace std;
int main() {
int n, m, c = 1;
cin >> n >> m;
int a[n][m];
for(int y=0; y<n; y++)
{
for(int x=0; x<m; x++)
{
if(x%2 == y%2)
{
a[y][x] = c;
c++;
}
else
{
a[y][x] = 0;
}
}
}
//вывод
cout<<" ";
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
std::cout.width(4); std::cout << a[i-1][j-1];}
cout<<endl;}
return 0;
}
По данным числам n и m заполните двумерный массив размером n×m числами от 1 до n×m по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке, как показано в примере.
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
int a[100][100] = {0};
int c = 1, k = 0, x_s = 1, y_s = 0, x = 0, y = 0;
for (int c = 1; c <= n*m; c++)
{
a[y][x] = c;
x += x_s;
y += y_s;
if (x < 0 || y<0 || x>m-1 || y>n-1 || a[y][x] != 0)
{
x -= x_s;
y -= y_s;
k++;
if (k == 4)
{
k = 0;
}
if (k == 0)
{
x_s = 1;
y_s = 0;
}
if (k == 1)
{
x_s = 0;
y_s = 1;
}
if (k == 2)
{
x_s = -1;
y_s = 0;
}
if (k == 3)
{
x_s = 0;
y_s = -1;
}
x += x_s;
y += y_s;
}
}
cout<<" ";
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
std::cout.width(4); std::cout << a[i-1][j-1];
}
cout<<endl;
}
return 0;
}
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы