Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2017, 11:13   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию Расположить первые 4 наименьшие положительные элемента матрицы А размерности mXn по углам этой матрицы.

Подскажите алгоритм для модифицированного задания №2 топика
http://www.programmersforum.ru/showthread.php?t=308100

Задание: Расположить первые 4 наименьшие положительные элемента матрицы А размерности mXn по углам этой матрицы.

еще вариант задания: Расположить первые 4 наименьшие положительные элемента матрицы А размерности mXn по углам этой матрицы заменив местами 1ый наименьший с элементом 1х1 (2ой с 1хN, 3ий с Mx1, 4ый с MxN)

Как узнать этих 4 наименьших в матрице?

В одномерном массиве через сортировку можно узнать.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 12.05.2017, 11:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
В одномерном массиве через сортировку можно узнать.
так представьте матрицу как одномерный массив (координаты элементарно пересчитываются как в одну, так и в другую сторону) и дальше - аналогично.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2017, 11:26   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

впрочем, всё не так просто.
если не указан порядок просмотра матрицы, то нельзя сказать, какие элементы ПЕРВЫЕ.

ну, например, дана матрица
Код:
-1 -4 -5 6 7
 2  3  9 2 1
какой здесь ПЕРВЫЙ положительный элемент? 2 или 6 ?
спорно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2017, 11:31   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
какой здесь ПЕРВЫЙ положительный элемент? 2 или 6 ?
6. Принимаем что обход делаем как печатная машинка: слева направо, новая строка, слева направо.....

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
так представьте матрицу как одномерный массив (координаты элементарно пересчитываются как в одну, так и в другую сторону)
сохранить матрицу в вектор и его сортировать?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 12.05.2017 в 11:34.
Aleksandr H. вне форума Ответить с цитированием
Старый 12.05.2017, 11:49   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Принимаем что обход делаем как печатная машинка: слева направо, новая строка, слева направо.....
я, в принципе, согласен.
но, понимаете, об этом должно быть прямо сказано в задании.

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
сохранить матрицу в вектор и его сортировать?
если нужно, чтобы первоначальная матрица не изменилась и осталась в исходном состоянии - то да, придётся так и поступить.
При этом нужно при сортировке сохранить исходную индексацию (чтобы можно было поменять местами найденные элементы - см. вторую задачу.
На самом деле сохранить индексы проще простого. и вариантов масса - начиная от использования структуры, или двухмерный массив или, заканчивая, отдельный вектор - для значений, отдельный - для порядковых номеров.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.05.2017, 00:57   #6
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Дана матрица A[n,m]
1) Заводим два массива из 4х элементов
1й: X = (MaxInt, MaxInt, MaxInt, MaxInt)
2й: Y = (-1,-1,-1,-1)
2) находим первый положительный элемент в матрице - A[i,j]
3) находим индекс первого максимума в массиве X - (переменная t)
4) если X[t] > A[i,j], то X[t] = A[i,j]; Y[t]:=i*n+j; (преобразуем массивы X и Y)
и так просматриваем все элементы матрицы.

Сортируем массивы X,Y относительно Y.
В итоге в X будет хранится первые положительные элементы в том порядке в котором они идут в матрице, а в Y их индексы.
Ну и если в массиве Y есть -1, то значит нет 4х положительных элементов в матрице.

Писал на PascalABC.Net
Код:
var 
  n:=4;
  m:=5;
  x:=Arr(MaxInt,MaxInt,MaxInt,MaxInt);
  y:=Arr(-1,-1,-1,-1);
  a:=MatrRandomInteger(n,m,-50,50);
begin
  a.Print(5);

  for var i:=0 to n-1 do
    for var j:=0 to m-1 do 
      if a[i,j]>0 then
        begin
          var t:=x.IndexMax;
          if x[t]>a[i,j] then
            (x[t],y[t]):=(a[i,j],i*m+j);
        end;
   x.ZipTuple(y).OrderBy(i->i[1]).Println;    
end.
Результат
Код:
  -39  -30  -25    9    5
   36  -29  -20   41    1
   44  -21  -50   49    2
    7    6  -31  -30  -15
(5,4) (1,9) (2,14) (6,16)
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 16.05.2017, 10:27   #7
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

На "моем" паскале чуть длиннее получилось.
Код:
Program pr;
uses crt;
const n=4;m=5;
a:array[1..n,1..m] of integer =
((-39,-30,-25,9,5),
 (36,-29,-20,41,1),
 (44,-21,-50,49,2),
 (7,6,-31,-30,-15)
);
type mas = array[1..4] of integer;
var
    x,y : mas;
  i,j,t : integer;
procedure OutData;
var i,j : integer;
begin
 for i:=1 to n do
  begin
   for j:=1 to m do write(a[i,j]:4);
   writeln;
  end
end;

function IndexMax(a:mas):integer;
{I'm painter, I can see like this :) 
And Yes, It can be shorter}
var i,m : integer;
 function GetMax(a:mas):integer;
 var i,m : integer;
 begin
   m:=a[1];
   for i := 2 to 4 do
    if a[i]>m then m:=a[i];
   GetMax := m;
 end;
begin
  m:=GetMax(a);
  for i:=1 to 4 do if a[i]=m then
      begin
        IndexMax:=i;
        break;
      end;
end;
procedure Sort;
var i,j,h:integer;
begin
  for i:=1 to 4 do
   for j:=i to 4 do
    if y[i]>y[j] then
     begin
       h:=y[j];y[j]:=y[i];y[i]:=h;
       h:=x[j];x[j]:=x[i];x[i]:=h;
     end;
end;

BEGIN
ClrScr;
outdata;
writeln;
x[1]:=MaxInt-1;x[2]:=MaxInt-1;x[3]:=MaxInt-1;x[4]:=MaxInt-1;
y[1]:=-1;y[2]:=-1;y[3]:=-1;y[4]:=-1;
for i:=1 to n do
 for j:=1 to m do
  if a[i,j]>0 then
   begin
      t:=IndexMax(x);
      if x[t]>a[i,j] then
       begin
         x[t]:=a[i,j];y[t]:=(i-1)*m+(-1+j);
       end
   end;
sort;
for i:=1 to 4 do
writeln(x[i]:4,', [',y[i] div m+1,',',(y[i]-(y[i] div m)*m)+1,']');
readln;
END.
Код:
  -39  -30  -25    9    5
   36  -29  -20   41    1
   44  -21  -50   49    2
    7    6  -31  -30  -15

   5, [1,5]
   1, [2,5]
   2, [3,5]
   6, [4,2]
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 16.05.2017 в 10:32.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Будем называть соседями элемента с индексами ij некоторой матрицы такие элементы этой матрицы, соответ... just_dake Помощь студентам 7 28.12.2018 14:33
При распараллеливании программы и запуске её в Linux не обрабатываются первые два элемента первой строки матрицы Novichok2016 Общие вопросы C/C++ 14 05.06.2016 15:10
Найти наименьшие элементы в каждой строке матрицы и номер максимального из них fort-_-minor Общие вопросы C/C++ 3 22.05.2013 15:44
Первый элемент - размерность матрицы, остальные образуют строки этой матрицы Anastasiya_Pot Помощь студентам 2 10.04.2012 09:46
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19