Дан двумерный массив целых чисел a из n строк и m столбцов. Требуется определить координаты (индексы+1) всех максимальных элементов в массиве
using namespace std;
int main() {
int n, m, k = 0;
//входные данные 2 3
//7 10 9
//10 -6 10
int a[100][100];
int imax = 0, jmax = 0, imin = 0, jmin = 0;
cin >> n >> m;
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++) {
if(a[i][j] > a[imax][jmax]){
imax = i;
jmax = j;
k++;
}
}
}
for (int i = 0; i <= k; i++) {
cout << imax + 1 << " " << jmax + 1 << endl;
}
//выводит только 1 2
// а должен 2 3
//7 10 9
//10 -6 10
return 0;
} ```
Ответы (2 шт):
Автор решения: AR Hovsepyan
→ Ссылка
Потому что вы выводите k раз одни и те же значения.
Этот счетчик вам не нужен, нужно вывести все индексы элементов, которые имеют те же значения, что и a[imax][jmax]:
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] == a[imax][jmax])
cout << i + 1 << " " << j + 1 << endl;
В данном примере вы могли бы определить максимальный элемент при вводе и написать цикл для вывода.
Автор решения: Harry
→ Ссылка
Вы сохраняете индексы только одного максимального элемента. Сохранять их все при первом проходе вы не можете, так как не знаете, чему же равен максимум.
Поэтому вам надо просто найти максимальное значение, а потом еще раз пройтись по всем элементам.
Максимально приближенно к вашему коду (хотя я бы использовал вектора, раз уж у вас С++):
#include <iostream>
using namespace std;
int main()
{
int n, m, M;
cin >> n >> m;
//входные данные 2 3
//7 10 9
//10 -6 10
int **a = new int*[n];
for(int i = 0; i < n; ++i) a[i] = new int[m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
M = a[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(a[i][j] > M) M = a[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(a[i][j] == M) cout << i+1 << " " << j+1 << endl;
}
}
}