Решение модуля 1.8 Введение в программирование C++

Модуль 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;
}

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x