Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Количество локальных максимумов, в матрице 
:(
    Опции темы
golden
Дата 12.11.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Задача: Дан массив [8,8].Найти количество локальных максимумов массива.

Требуется самое простое решение задачи. Заранее благодарю. Golden
PM MAIL   Вверх
powerfox
Дата 12.11.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



А что такое локальный максимум?


--------------------
user posted image
PM WWW   Вверх
volvo877
Дата 12.11.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Локальный максимум матрицы - элемент, который больше всех своих соседей...
PM MAIL   Вверх
powerfox
Дата 12.11.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



А соседи - числа и по строкам и по столбцам? И по диагонале?

93445
23232
23232

А11 - максимум? Так как рядом 3-3-2?


--------------------
user posted image
PM WWW   Вверх
golden
Дата 13.11.2006, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Вы мне программу скиньте пожалуйсто!
PM MAIL   Вверх
powerfox
Дата 13.11.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



golden, а ты объясни чего надо, я и скину. Тут писанины на 2 минуты.
Выходит, что надо сравнивать Аnn с А(n+-1)n и c Аn(n+-1)?


--------------------
user posted image
PM WWW   Вверх
Alexeis
Дата 13.11.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата(powerfox @  13.11.2006,  13:53 Найти цитируемый пост)
Выходит, что надо сравнивать Аnn с А(n+-1)n и c Аn(n+-1)? 

Ну поскольку это матрица, то соседей либо 8 либо 4 (в зависимости от того как смотреть)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
golden
Дата 13.11.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



2powerfox\да ты прав:Выходит, что надо сравнивать Аnn с А(n+-1)n и c Аn(n+-1).Вот это и надо сделать только я незнаю как.
PM MAIL   Вверх
volvo877
Дата 13.11.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Код
const n = 8;
var
  a: array[1 .. n, 1 .. n] of integer;
  i, j, ix, iy: integer;
  bad: boolean;

  max_amount: integer;

begin


  for i := 1 to n do begin
    writeln('line #', i);
    for j := 1 to n do begin
      writeln('a[', i, ',', j, '] = ');
      readln(a[i, j]);
    end;
  end;


  max_amount := 0; { <--- Это то, что ты ищешь}

  for i := 1 to n do
    for j := 1 to n do begin
      bad := false;
      for ix := -1 to 1 do
        for iy := -1 to 1 do
          if (ix * iy = 0) and
             ((i + ix) > 0) and ((i + ix) <= n) and
             ((j + iy) > 0) and ((j + iy) <= n) and
             (a[i, j] < a[i+ix, j+iy]) then bad := true;

      if not bad then inc(max_amount);
    end;

  writeln('local max count: ', max_amount);

end.

PM MAIL   Вверх
powerfox
Дата 13.11.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Вот код. Внимательно проверь индексы.
Код

program local_maximum;
var
matrix:Array[1..8,0..8] of Integer;
temp,i,j,strings,stolb:Integer;

count_max:Integer;
begin
count_max:=0;
Writeln('');

for j:=1 to 8 do
  begin
  for i:=1 to 8 do
    read(matrix[j][i]);
  readln;
  writeln ('Enter the next string:');
  end;
readln;

{"Внутренняя" матрица}
for j:=2 to 7 do
  for i:=2 to 7 do
  if (matrix[j][i]>matrix[j][i-1])and(matrix[j][i]>matrix[j][i+1])and(matrix[j][i]>matrix[j-1][i])and(matrix[j][i]>matrix[j+1][i]) then
      if (matrix[j][i]>matrix[j-1][i-1])and(matrix[j][i]>matrix[j+1][i+1])and(matrix[j][i]>matrix[j+1][i-1])and(matrix[j][i]>matrix[j+1][i+1]) 
      inc(count_max);

{Верхняя строка без углов}
j:=1;   
for i:=2 to 7 do
 if (matrix[j][i]>matrix[j][i-1])and(matrix[j][i]>matrix[j][i+1])and(matrix[j][i]>matrix[j+1][i]) then
      inc(count_max);


{Нижняя строка без углов}
j:=strings;   
for i:=2 to 7 do
 if (matrix[j][i]>matrix[j][i-1])and(matrix[j][i]>matrix[j][i+1])and(matrix[j][i]>matrix[j+1][i]) then
      inc(count_max);

{Левый столбец без углов}
i:=1;
for j:=2 to 7 do
if (matrix[j][i]>matrix[j][i+1])and(matrix[j][i]>matrix[j-1][i])and(matrix[j][i]>matrix[j+1][i]) then
      inc(count_max);

{Правый столбец без углов}
i:=8;
for j:=2 to 7 do
if (matrix[j][i]>matrix[j][i-1])and(matrix[j][i]>matrix[j-1][i])and(matrix[j][i]>matrix[j+1][i]) then
      inc(count_max);

{Углы}
if (matrix[1][1]>matrix[2][1])and(matrix[1][1]>matrix[1][2])and(matrix[1][1]>matrix[2][2]) then
   inc(count_max);

if (matrix[1][8]>matrix[1][7])and(matrix[1][8]>matrix[2][8])and(matrix[1][8]>matrix[2][7]) then
   inc(count_max);

if (matrix[8][1]>matrix[8][2])and(matrix[8][1]>matrix[7][1])and(matrix[8][1]>matrix[7][2]) then
   inc(count_max);
if (matrix[8][8]>matrix[8][7])and(matrix[8][8]>matrix[7][8])and(matrix[8][8]>matrix[7][7]) then
   inc(count_max);


writeln('Num of local maximums is',count_max);

end.



--------------------
user posted image
PM WWW   Вверх
powerfox
Дата 13.11.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



volvo877, красивое решение, но нерабочее. У тебя там с этим наворотом bad проблемы.



--------------------
user posted image
PM WWW   Вверх
likehood
Дата 13.11.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



чуть подправил решение volvo877:
Код

const n = 8;    
var    
  a: array[1 .. n, 1 .. n] of integer;    
  i, j, ix, iy: integer;    
  bad: boolean;    
  max_amount: integer;    
begin    
  for i := 1 to n do begin    
    writeln('line #', i);    
    for j := 1 to n do begin    
      writeln('a[', i, ',', j, '] = ');    
      readln(a[i, j]);    
    end;    
  end;    
  max_amount := 0; { <--- Это то, что ты ищешь}    
  for i := 1 to n do    
    for j := 1 to n do begin    
      bad := false;    
      for ix := -1 to 1 do    
        for iy := -1 to 1 do    
          if (not (ix=0 and iy=0)) and      { <<<< чтобы не сравнивать с самим собой }
             ((i + ix) > 0) and ((i + ix) <= n) and    
             ((j + iy) > 0) and ((j + iy) <= n) and    
             (a[i, j] < a[i+ix, j+iy]) then bad := true;    
      if not bad then inc(max_amount);    
    end;    
  writeln('local max count: ', max_amount);    
end.

PM MAIL   Вверх
golden
Дата 13.11.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 11.11.2006

Репутация: нет
Всего: нет



Ок спасибо разберусь
PM MAIL   Вверх
volvo877
Дата 13.11.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(powerfox @  13.11.2006,  17:02 Найти цитируемый пост)
красивое решение, но нерабочее.
Правда? А ты проверял?
Я вот прогнал на матрице - как положено, так и отрабатывает. 

Код

const
  n = 4;
  a: array[1 .. n, 1 .. n] of integer = (
    (1, 2, 3, 4),
    (1, 4, 6, 3),
    (8, 2, 5, 2),
    (3, 4, 5, 6)
  );


4 локальных максимума. Показать, или найдешь сам?
Приведи мне матрицу, на которой МОЮ программу проверял ТЫ...

Добавлено @ 19:03 
baronp, теперь вопрос к тебе: чем тебе помешало сравнение с самим собой? Ты считаешь, что это может повлиять на правильность результата? Могу тебя огорчить: ты не разобрался в логике работы программы, в следующий раз сначала разберись, а потом будешь критиковать...

К тому же с твоим исправлением будут сравниваться и диагональные элементы (рассказать, почему?), а этого (судя по посту автора) делать не нужно:
Цитата(golden @  13.11.2006,  14:03 Найти цитируемый пост)
Аnn с А(n+-1)n и c Аn(n+-1)



PM MAIL   Вверх
powerfox
Дата 13.11.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 97



volvo877, не чиркай красным, а то это харазительно:

Твой код:
Цитата

Код

 for i := 1 to n do    
    for j := 1 to n do begin    
     [color=red] bad := false;    [/color]
      for ix := -1 to 1 do    
        for iy := -1 to 1 do    
          if (ix * iy = 0) and    
             ((i + ix) > 0) and ((i + ix) <= n) and    
             ((j + iy) > 0) and ((j + iy) <= n) and    
           [color=red]  (a[i, j] < a[i+ix, j+iy]) then bad := true;    [/color]
     [color=red] if not bad then inc(max_amount);[/color]    
    end;



У тебя true устанавливается, даже если выполняется условие для одного соседнего элемента.
Для матрицы
1 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Ответ получился 54.


Цитата(volvo877 @  13.11.2006,  19:59 Найти цитируемый пост)
К тому же с твоим исправлением будут сравниваться и диагональные элементы (рассказать, почему?), а этого (судя по посту автора) делать не нужно:

Автор сам не знает, что ему надо (кроме рещённой задачи). По диагонале надо сравнивать:



--------------------
user posted image
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.