Индексы минимальных элементов матрицы

Задача

Вывести на экран индексы всех минимальных элементов матрицы.

Пояснение к задаче и алгоритм решения

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

Задача складывается из двух подзадач, которые должны быть решены последовательно:

  1. Поиск минимума в массиве (в данном случае двумерном).
  2. Поиск элементов, равных ранее найденному минимуму.

Найденное минимальное значение должно быть сохранено в переменной (например, minimum). Однако можно было бы сохранять не само значение, а индекс элемента массива. Но поскольку мы имеем дело с матрицей, то пришлось бы сохранять два числа (номер строки и номер столбца).

Алгоритм поиска минимального значения:

  1. Присвоить minimum максимально возможное (или больше) значение для исследуемого массива.
  2. Перебрать элементы матрицы (используя конструкцию вложенного цикла). Каждый элемент сравнивать со значением minimum. Если очередной элемент меньше значения minimuma, то следует присвоить значение текущего элемента переменной minimum.

Алгоритм определения позиций всех минимальных элементов матрицы:

  1. Снова перебираем элементы матрицы.
  2. Сравниваем каждый элемент со значением minimum.
  3. Если они равны между собой, то выводим индексы текущего элемента на экран. (Индексы текущего элемента - это значения счетчиков первого и второго циклов.)

Примечания:

  • Ниже в решениях задачи поиска индексов минимальных элементов на языках программирования поиск минимального значения выполняется в том же цикле, что и заполнение матрицы.
  • Если индексация массива начинается с нуля, то лучше при выводе индексов увеличивать их на единицу. Так будет более ясно, где находится элемент.

Исходный код на языке программирования Pascal

const N = 5; M = 7;
var
    mx: array[1..N,1..M] of integer;
    min: integer;
    i, j: byte;
begin
    min := MAXINT;
    randomize;
    for i:=1 to N do begin
        for j:=1 to M do begin
            mx[i,j] := random(50) - 25;
            write(mx[i,j]:4);
            if mx[i,j] < min then min:=mx[i,j];
        end;
        writeln;
    end;
    writeln('Минимальное значение: ', min);
    for i:=1 to N do
        for j:=1 to M do
            if mx[i,j] = min then
                writeln('строка: ', i, '; столбец: ', j);
end.

Пример(ы) выполнения программы на языке Pascal

 -19   6   3  18 -12  -3  24
  -4  15  -6  19 -15  -1   4
   6  -9 -12  23  -3   3 -11
   5   0 -11  -4 -19  -6   1
  17  20  -1   6  17  -1  15
Минимальное значение: -19
строка: 1; столбец: 1
строка: 4; столбец: 5

Исходный код на языке программирования C

#include <stdio.h>
#define M 7
#define N 5
main() {
    int a[N][M];
    int min, i, j;
    srand(time(NULL));
    min = 25;
    for (i=0; i<N; i++) {
        for (j=0; j<M; j++) {
            a[i][j] = rand() % 50 - 25;
            printf("%5d", a[i][j]);
            if (min > a[i][j]) min = a[i][j];
        }
        printf("\n");
    }
    printf("%d\n", min);
    for (i=0; i<N; i++) {
        for (j=0; j<M; j++) {
            if (min == a[i][j])
                printf("row: %d, col: %d\n", i+1, j+1);
        }
    }
}

Исходный код на языке программирования Python

from random import random
M = 7
N = 5
a = []
for i in range(N):
    b = []
    for j in range(M):
        b.append(int(random()*50) - 25)
        print("%4d" % b[j], end='')
    a.append(b)
    print()
min_mx = 25
for i in range(N):
    min_i = min(a[i])
    if min_i < min_mx:
        min_mx = min_i
print(min_mx)
for i in range(N):
    for j in range(M):
        if min_mx == a[i][j]:
            print('Row: %d, col: %d' % (i+1,j+1))

Особенности решения на языке программирования Python

Пример выполнения:

 -18 -23  -8  17  12   4 -22
  16 -10 -18   6  -9  19  23
   8  -1  -7   0  -9  24 -12
  -5  16  14  -2   1   7 -16
  -7   5   1 -23  -4  -4  17
-23
Row: 1, col: 2
Row: 5, col: 4

В языке Python есть встроенная функция min, которая возвращает минимальный элемент одномерного списка. Если же ее применить к двумерному списку, то она возвращает вложенный список, первый элемент которого оказывается минимальным.

Поэтому в коде поиска минимального элемента матрицы эта функция используется к каждой строке (вложенному списку) отдельно.

Использование функции min позволяет не перебирать отдельные элементы каждой строки, а ограничиться только перебором самих строк.

Классический вариант поиска минимального значения матрицы выглядел бы так:

 ... min_mx = 25 for i in range(N): for j in range(M): if a[i][j] < min_mx: min_mx = a[i][j] ...

Исходный код на языке программирования КуМир

алг индексы минимумов
нач
    цел M = 7, N = 5
    цел таб a[1:N,1:M]
    цел i, j, minimum
    minimum := 25
    нц для i от 1 до N
         нц для j от 1 до M
              a[i,j] := int(rand(0,50)) - 25
              вывод a[i,j]:4, "  "
              если minimum > a[i,j] то
                  minimum := a[i,j]
              все
         кц
         вывод нс
    кц
    вывод minimum, нс
    нц для i от 1 до N
         нц для j от 1 до M
             если minimum = a[i,j] то
                  вывод "строка: ",i, ", столбец: ",j, нс
             все
         кц
    кц
кон

Исходный код на языке программирования Basic

M = 7
N = 5
dim a(N,M)
min = 25
for i = 0 to N-1
        for j=0 to M-1
                a[i,j] = int(rand*50)-25
                print a[i,j] + "   ";
                if min > a[i,j] then min = a[i,j]
        next j
        print
next i
print min
for i = 0 to N-1
        for j=0 to M-1
                if min = a[i,j] then print (i+1) + "   " + ( j+1)
        next j
next i

Тема

Матрицы

Уровень сложности

Простой

Дата публикации