Как в двумерном массиве найти наибольшее число

Изучаю С++ по purecodecpp.com/archives/1158 и нашел задачку в комментариях, которую не могу решить.
Массив заполнил, разделил на одномерные и тут заглох, не знаю как найти наибольшее число.

Вот сам код с условием.

/*
В метании молота состязается n спортcменов. Каждый из них сделал m бросков.
Победителем соревнований объявляется тот спортсмен, у которого максимален наилучший результат по всем броскам.
Таким образом, программа должна найти значение максимального элемента в данном массиве,
а также его индексы (то есть номер спортсмена и номер попытки).
Входные данные
Программа получает на вход два числа n и m, являющиеся числом строк и столбцов в массиве.
Далее во входном потоке идет n строк по m чисел, являющихся элементами массива.

Выходные данные
Программа выводит значение максимального элемента, затем номер строки и номер столбца,
в котором он встречается. Если в массиве несколько максимальных элементов,
то нужно вывести минимальный номер строки, в которой встречается такой элемент,
а если в этой строке таких элементов несколько, то нужно вывести минимальный номер столбца.
Не забудьте, что все строки и столбцы нумеруются с 0.
*/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <ctime>
#include <iomanip> // setw(отступ)

using namespace std;

int main() {

	setlocale(0, "");
	srand(time(NULL));

	const int ROWSIZE = 3;
	const int COLSIZE = 3;

	int arr[ROWSIZE][COLSIZE] = {};
	// заполнение массива с клавиатуры
	/*
	for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
		for (int colNum = 0; colNum < COLSIZE; colNum++) {
			cout << "Пожалуйста, введите исходные значения массива: ";
			cout << rowNum + 1 << "-я строка ";
			cout << colNum + 1 << "-я колонка ";
			cin >> arr[rowNum][colNum];
			
		}
	}
	*/
	// Заполняем массив случайными числами
	for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
		cout << "Строка " << rowNum + 1 << ": ";
		for (int colNum = 0; colNum < COLSIZE; colNum++) {
			arr[rowNum][colNum] = 1 + rand() % 9;
			cout << setw(2) << arr[rowNum][colNum];
		}
		cout << endl;
	}
	// Разделяем двумерный массив на одномерные
	int row[ROWSIZE]{};
	int col[COLSIZE]{};
	for (int r = 0; r < ROWSIZE; r++) {
		row[r] = arr[r - 1][COLSIZE];
		cout << row[r] << "|";
		
		for (int c = 0; c < COLSIZE; c++) {
			col[c] = arr[c][r];
			//cout << col[c] << "|" << endl;
		}
		
	}
	system("pause");
	return 0;
};

I’m trying to find an elegant way to find the max value in a two-dimensional array.
for example for this array:

[0, 0, 1, 0, 0, 1] [0, 1, 0, 2, 0, 0][0, 0, 2, 0, 0, 1][0, 1, 0, 3, 0, 0][0, 0, 0, 0, 4, 0]

I would like to extract the value ‘4’.
I thought of doing a max within max but I’m struggling in executing it.

snakecharmerb's user avatar

snakecharmerb

45.6k11 gold badges97 silver badges146 bronze badges

asked Nov 20, 2016 at 8:11

Shuki's user avatar

Another way to solve this problem is by using function numpy.amax()

>>> import numpy as np
>>> arr = [0, 0, 1, 0, 0, 1] , [0, 1, 0, 2, 0, 0] , [0, 0, 2, 0, 0, 1] , [0, 1, 0, 3, 0, 0] , [0, 0, 0, 0, 4, 0]
>>> np.amax(arr)

answered Jul 24, 2018 at 11:03

Khan Saad Bin Hasan's user avatar

2

Max of max numbers (map(max, numbers) yields 1, 2, 2, 3, 4):

>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]

>>> map(max, numbers)
<map object at 0x0000018E8FA237F0>
>>> list(map(max, numbers))  # max numbers from each sublist
[1, 2, 2, 3, 4]

>>> max(map(max, numbers))  # max of those max-numbers
4

answered Nov 20, 2016 at 8:13

falsetru's user avatar

falsetrufalsetru

354k63 gold badges719 silver badges631 bronze badges

Not quite as short as falsetru’s answer but this is probably what you had in mind:

>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]
>>> max(max(x) for x in numbers)
4

answered May 21, 2018 at 1:34

schmy's user avatar

schmyschmy

1211 silver badge5 bronze badges

>>> numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]

You may add key parameter to max as below to find Max value in a 2-D Array/List

>>> max(max(numbers, key=max))
4

answered Jun 7, 2021 at 2:22

afghani's user avatar

afghaniafghani

3494 silver badges7 bronze badges

How about this?

import numpy as np
numbers = np.array([[0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]])

print(numbers.max())

4

cebe's user avatar

cebe

3,5501 gold badge23 silver badges37 bronze badges

answered Apr 8, 2020 at 11:57

Gurami's user avatar

1

One very easy solution to get both the index of your maximum and your maximum could be :

numbers = np.array([[0,0,1,0,0,1],[0,1,0,2,0,0],[0,0,2,0,0,1],[0,1,0,3,0,0],[0,0,0,0,4,0]])
ind = np.argwhere(numbers == numbers.max()) # In this case you can also get the index of your max
numbers[ind[0,0],ind[0,1]]

answered Apr 1, 2021 at 14:57

Markh's user avatar

MarkhMarkh

535 bronze badges

This approach is not as intuitive as others but here goes,

numbers = [0, 0, 1, 0, 0, 1], [0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 1], [0, 1, 0, 3, 0, 0], [0, 0, 0, 0, 4, 0]

maximum = -9999

for i in numbers:

    maximum = max(maximum,max(i))

return maximum"

answered Jun 25, 2022 at 3:39

EdwardFunnyHands's user avatar

I want to find the maximum value of the two-dimensional array. I found this value without using multithreading. How do I find the maximum value of the two-dimensional array using multithreading? I want to compare the speed of finding the maximum value of the array in different ways.

public class Search {

    public int[][] fillMatrix(int matrix[][]) {
        for (int i = 0; i < matrix.length; i++){
            for (int j = 0; j < matrix[i].length; j++){
              matrix[i][j] = (int)(Math.random() * 1000);
            }
        }
        return matrix;
    }

    public int searchMaxValue(int[][] matrix, int row, int column) {
        int max = matrix[0][0];
        for (int a = 0; a < row; a++) {
            for (int b = 0; b < column; b++) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (matrix[a][b] > max) {
                    max = matrix[a][b];
                }
            }
        }
        return max;
    }


    public static void main(String[] args) {

        Search search = new Search();
        int[][] matrix = new int[4][100];
        search.fillMatrix(matrix);
        long start = System.currentTimeMillis();
        int max = search.searchMaxValue(matrix, 4, 100);
        long end = System.currentTimeMillis();
        System.out.println("Max value is " + max);
        System.out.println("Time for execution: " + (end - start));
    }
}

asked Jun 5, 2016 at 14:36

Kirk_Hammett's user avatar

1

Here is the outline how you would go about implementing this. I am not providing code intentionally, so that you can have the joy of implementing it yourself.

create a method to findmax out of an array lets call it findMax(int[]
input)

for each sub array in 2D array (can be accessed using matrix[i])
start a thread to findMax(matrix[i]) (hint: use ExecutorService)
in the thread, once max is found, fill it in to ith position
of a one dimensional array called results in the thread, indicate
its completion(hint: use CountDownLatch)

In the main thread, wait till all threads finish ( hint: use
CountDownLatch) Now call findMax(results) and you have the
maxiumum from matrix.

Considerations: Do we need to fork as many threads as the rows in matrix? So do we use a FixedThreadPool with number of rows ?

answered Jun 6, 2016 at 14:02

ring bearer's user avatar

ring bearerring bearer

20.2k7 gold badges59 silver badges71 bronze badges

1

The simplest way would be to start a thread to calculate the maximum in each of the four rows in the matrix, have the main thread join all of these row threads and calculate the maximum of the four row maxima. You will likely need a much larger array to be able to see the time difference, though. Don’t neglect the necessary synchronization.

If as I suspect you are looking for code, you should make an attempt at the solution and run it, then repost or elaborate this post with the problems you run into.

answered Jun 5, 2016 at 14:50

Warren Dew's user avatar

Warren DewWarren Dew

8,7623 gold badges30 silver badges44 bronze badges

Here is how to do it in java 8:

int[][] values = fillMatrix(new int[1000][1000]);
OptionalInt max = Arrays.stream(values)
    .parallel()
    .flatMapToInt(Arrays::stream)
    .parallel()
    .max();

But frankly speaking, I’m not sure that for such simple computation it makes sense to use several threads, indeed creating and orchestrating threads has a price which seems to be too high in this case.

Response Update

As it is your homework, I provide an answer without any comments on purpose in order to ensure that you will at least think about how it works, but the main idea is to provide chunk of data to each thread to avoid collisions as next:

int[][] matrix = fillMatrix(new int[100][100]);
int totalThreads = 10;
int[] results = new int[totalThreads];
int chunkSize = matrix.length / totalThreads;
CountDownLatch end = new CountDownLatch(totalThreads);
for (int i = 0; i < totalThreads; i++) {
    int threadIndex = i;
    new Thread(
        () -> {
            int max = -1;
            int startIndex = threadIndex * chunkSize;
            for (int j = startIndex; j < startIndex + chunkSize && j < matrix.length; j++) {
                for (int k = 0; k < matrix[j].length; k++) {
                    if (max == -1 || max <  matrix[j][k]) {
                        max = matrix[j][k];
                    }
                }
            }
            results[threadIndex] = max;
            end.countDown();
        }
    ).start();
}
end.await();
int max = results[0];
for (int k = 1; k < results.length; k++) {
    if (max < results[k]) {
        max = results[k];
    }
}
System.out.printf("Max found %d%n", max);

answered Jun 5, 2016 at 16:48

Nicolas Filotto's user avatar

Nicolas FilottoNicolas Filotto

43.2k11 gold badges94 silver badges122 bronze badges

4

В общем, я вот так записала программу но что- то в ней не то, потому что она не максимальный выводит
var a:array[1..10,1..5] of integer;
i,j,max:integer;
begin
randomize;
for i:=1 to 10 do
begin
for j:=1 to 5 do
begin
a[i,j]:=random(50);
write(a[i,j]:4);
end;
writeln;
end;

for i:=1 to 10 do
max:=a[i,1];
begin

for j:=1 to 5 do

begin
if a[i,j]>max then max:=a[i,j];
end;
writeln(‘max=’,max);
end;
writeln;
end.

Все равно что то не то. Вот какой ответ получаем в результате программы (см. ниже)
20 30 33 46 22
27 22 32 23 31
0 21 43 34 30
16 41 24 2 46
36 10 46 18 24
46 4 23 7 25
0 36 36 27 10
14 10 39 41 33
21 40 42 4 47
47 41 35 14 7
max=46
max=46
max=46
max=46
max=46
max=46
max=46
max=46
max=47
max=47.Есть еще у кого нибудь варианты?

А нет все все спссибо та прога правильна просто надо было вывод поставить перед последним эндом!!)))

Двухмерные массивы на 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;
}

Добавить комментарий