Найти минимальный элемент матрицы ниже побочной диагонали

Задача

В квадратной матрице найти минимальный элемент ниже побочной диагонали. Кроме того вывести на экран в табличном виде исходную матрицу и отдельно часть матрицы ниже побочной диагонали.

Решение

 

Побочная диагональ матрицы идет от верхнего правого угла до нижнего левого. Пусть N - это размерность квадратной матрицы, i - это номер строки, а j - номер столбца (или номер элемента в строке). Тогда, если перебирать построчно матрицу, то элемент, стоящий на побочной диагонали будет иметь индекс [i, N-i+1]. Действительно, когда i = 1, то j = N, то есть это последний элемент первой строки. Когда i = 2, то j = N - 1, - это предпоследний элемент второй строки; и так далее.

Таким образом можно сделать вывод, что все элементы в конкретной строке от побочной диагонали и до конца строки имеют индексы от N-i+1 до N.

Учитывая то, что сама диагональ нас не интересует, следует в каждой строке первым брать не элемент диагонали, а следующий за ним. Следовательно, формула первого элемента строки после побочной диагонали будет иметь вид N-i+2.

Для того, чтобы вывести часть матрицы ниже побочной диагонали так же, как она располагается в выводе всей матрицы, надо заполнить строку пробелами в количестве, соответствующем количеству невыведенных элементов. Так, в примере ниже, на каждый элемент отводится 5 знакомест. Количество невыведенных элементов каждой строки равно N-i+1. Таким образом общее количество пробелов равно 5(N-i+1).

Сам поиск минимума - это самая легкая часть задачи. При выводе элементов, расположенных ниже побочной диагонали, их заодно можно проверять, не меньше ли они уже найденного минимума.

Программа на языке Паскаль: 

 

const N = 10;
var 
    m: array[1..N,1..N] of integer;
    i, j: byte;
    min: integer;
begin
    randomize;
    for i:=1 to N do begin
        for j:=1 to N do begin
            m[i,j] := random(100) - 50;
            write(m[i,j]:5);
        end;
        writeln;
    end;
    min := 32767;
    for i:=1 to N do begin
        write(' ':5 * (N - i+1));
        for j:=N-i+2 to N do begin
            write(m[i,j]:5);
            if min > m[i,j] then min := m[i,j];
        end;
        writeln();
    end;
    writeln('Minimum: ', min);
end.

 

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

   37  -15  -14   25  -18   28  -49  -27  -32  -38
  -10  -26    1   33   49    0   41   28   11   39
  -43   -5  -33   33  -15    5  -15   -3    1  -24
  -19  -27  -24   16   46   10   28   47   41  -15
   26   42   -1    6   46   22   -1  -20   11  -34
  -48   10  -45   25  -34   30    5   35  -32   24
  -26   33   29  -37  -11  -14  -11  -10   -7  -15
  -12   27  -17   24  -46   23  -30  -31  -38  -19
   30  -44   37   37  -27   40   -7   19  -29  -32
    8  -33   47  -26   31   43   11   -3   24    5
 
                                                39
                                            1  -24
                                      47   41  -15
                                 -1  -20   11  -34
                            30    5   35  -32   24
                      -11  -14  -11  -10   -7  -15
                  24  -46   23  -30  -31  -38  -19
             37   37  -27   40   -7   19  -29  -32
       -33   47  -26   31   43   11   -3   24    5
Minimum: -46

 

Тема

Матрицы

Уровень

Сложные задачи

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