Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.83
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
#1

Найти количество локальных минимумов в матрице - C++

22.11.2011, 19:36. Просмотров 3088. Ответов 37
Метки нет (Все метки)

Можете подсказать как найти кол-во локальных минимумов в двумерном массиве?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2011, 19:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти количество локальных минимумов в матрице (C++):

Посчитать количество локальных минимумов в матрице - C++
Элемент двохмерного масива называют локальным минимумом, если он имеет значение ,меньше значений своих соседей. Посчитать количество...

Подсчитать количество локальных минимумов в матрице - C++
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных...

Найти количество локальных минимумов в одномерном массиве - C++
Составьте функцию, определяющую количество локальных минимумов для массива целых чисел. Элемент является локальным минимумом, если он...

Найти в массиве количество локальных минимумов значение которых кратно трем - C++
У меня такая проблема у меня есть задача Задание 25 № 7319. Дан массив, содержащий 2014 положительных целых чисел. Напишите на одном из...

Подсчитать количество локальных минимумов матрицы, найти сумму модулей элементов выше главной диагонали - C++
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных...

Определение количества локальных минимумов в заданной матрице. Нахождение суммы модулей элементов - C++
Здравствуйте! Прошу помощи в лабораторной работе. Задание: 1. Консольный ввод/вывод вещественного массива размером 5*5 2. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
26.11.2011, 22:57  [ТС] #16
Цитата Сообщение от KuKu Посмотреть сообщение
Скажите об этом Страуструпу.
Я конечно извиняюсь, но у меня появилась проблема, мы еще булевский тип не проходили, я почитал все понял, но преподаватель требует сделать без булевского типа, не могли бы вы помочь мне сделать простым перебором?
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
26.11.2011, 23:15 #17
Не могли, если вы поняли логику, то переделать ее можно на раз. Если что-то непонятно - спрашивайте.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
26.11.2011, 23:33  [ТС] #18
я сделал, только не работает)

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
int main()
{
 int nstr, nstb;
 int i, j, kol_lmin;
 cout<<"Vvedite kol-vo strok i stolbcov cherez probel ";
 cin>>nstr>>nstb;
 int **mas=new int *[nstr];
 for(i=0;i<nstr;i++)
 mas[i]=new int [nstb];
 cout<<"\nAlementi massiva: \n\n";
 for(i=0;i<nstr;i++)
  for(j=0;j<nstb;j++)
 { mas[i][j]=random(30);
   cout<<"mas ["<<i<<"] "<<"["<<j<<"] = "<<mas[i][j]<<endl;
 }
 for(i=0;i<nstr;i++)
 {
   cout<<endl<<endl;
   for(j=0;j<nstb;j++) cout<<setw(3)<<mas[i][j]<<" ";
 }
 kol_lmin=0;
int k=nstr-1;
   for(i=0;i<nstr;i++)
     for(j=0;j<nstb;j++)
     {
       if((j==0)&&(i==1)){ j=0;
                           for(i=1;i<nstr-1;i++)
                              {
                               if((mas[i][j]<mas[i-1][j])&&(mas[i][j]<mas[i+1][j])&&(mas[i][j]<mas[i][j+1])) {cout<<"\n"<<i<<j; kol_lmin++;}
                              }
                         }break;
       if((i == 0)&&(j == 0)) {if((mas[i][j]<mas[i+1][j])&&(mas[i][j]<mas[i][j+1])) {cout<<"\n"<<i<<j; kol_lmin++;}} //если первый элемент
       if((i == 0)&&(j == nstb)) {if((mas[i][j]<mas[i+1][j])&&(mas[i][j]<mas[i][j-1])) {cout<<"\n"<<i<<j; kol_lmin++;}} //если элемент в правом верхнем углу
       if((i == nstr-1)&&(j == 0)) {if((mas[i][j]<mas[i][j+1])&&(mas[i][j]<mas[i-1][j])) {cout<<"\n"<<i<<j; kol_lmin++;}}    //если элемент в левом нижнем углу
       if((i == nstr-1)&&(j == nstb-1)) {if((mas[i][j]<mas[i-1][j])&&(mas[i][j]<mas[i][j-1])) {cout<<"\n"<<i<<j; kol_lmin++;}}  //если элемент в правом нижнем углу
        if((j == 1)&&(i == 1)){ for(i=1;i<nstr-2;i++){    //верхняя строка между первы и послед(в пр верхнем углу)
                               for(j=1;j<nstb-2;j++)
                                 {
                                  if((mas[i][j]<mas[i+1][j])&&(mas[i][j]<mas[i-1][j])&&(mas[i][j]<mas[i][j-1])&&(mas[i][j]<mas[i][j+1])) {cout<<"\n"<<i<<j; kol_lmin++;}
                                 }
                                 }
                              }
        if((j == 1)&&(i == 0)){ i=0;            //элементы по середине, построчный поиск
                           for(j=1;j<nstb-1;j++)
                              {
                               if((mas[i][j]<mas[i][j-1])&&(mas[i][j]<mas[i+1][j])&&(mas[i][j]<mas[i][j+1])) {cout<<"\n"<<i<<j; kol_lmin++;}
                              }
                         }
     }
 cout<<"\n\nKol-vo lokmin = "<<kol_lmin;
 getch();
 return(0);
}
Мой код, тут пока поиск не по всем элементам, но мне кажется что это все не правильно)
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:05 #19
C++
1
2
3
4
5
6
7
8
9
for(int i=0;i<width;++i)
  for(int j=0;j<height;++j)
  {
    if (i!=0 && a[i-1][j]<a[i][j]) break;
    if (i!=width-1 && a[i+1][j]<a[i][j]) break;
    if (j!=0 && a[i][j-1]<a[i][j]) break;
    if (i!=height-1 && a[i][j+1]<a[i][j]) break;    
    ++cnt;
  }
Как-то так должно быть - не проверял. Правда я не уверен, если i=0, будет ли проверяться второе условие. По идее не должно, хотя кто его знает. Надо спросить у более знающих). Если будет, то разбейте на два if-а.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:10  [ТС] #20
Вроде не должно, ведь breakи стоят

Добавлено через 2 минуты
здесь проверка всего массива?) просто щас попробовал из 4 локмин вывел только один)
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:13 #21
C++
1
    if (i!=0 && a[i-1][j]<a[i][j]) break;
Про эту строчку имел ввиду. Если i = 0, то условие ложно. a[i-1][j]<a[i][j] - истинность этого выражения не имеет уже значения. Вот я не уверен, будет ли программка его проверять. По идее не должна.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:17  [ТС] #22
Так тут проверяется сразу весь массив?_) просто не совсем понимаю условия
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:28 #23
Ой, извиняюсь, break на continue замените. Да, весь массив.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:39  [ТС] #24
Я вам благодарен, но теперь появилась другая проблема) можете объяснить условия)
вот например, (i!=0 && mas[i-1][j]<mas[i][j]) и почему именно такие условия, просто не пойму что-то.

Добавлено через 1 минуту
чтобы быстрее, понять, не напомните continue - это чтобы допустим если выполнилось 1 условие обход всех послед?
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:42 #25
Возьмем элемент в центре. Если слева от него есть элемент меньше, значит он не минимум => переходим к следующему элементу. Аналогично для справа, сверху, снизу. Условие i!=0 и ему подобные - это отсеивание проверки для элементов по краям. То есть, если элемент у левой стенки, значит слева от него элементов нет и проверять там не надо. Если все условия в итоге не выполнились(вокруг нет меньших элементов), то делается cnt++;
continue - досрочно закончить одну итерацию цикла.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:48  [ТС] #26
как я понял по первым словам, то проверка начинается с центра? Блин вообще не понимаю эти условия, так что-то понимаю, но видимо еще не созрел до такого)

Добавлено через 1 минуту
Цитата Сообщение от KuKu Посмотреть сообщение
Если слева от него есть элемент меньше, значит он не минимум => переходим к следующему элементу.
Где происходит сравнение ?=)
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:48 #27
Это объяснение начинается с центра - порядок пробега тут не важен) Цикл бежит все от 0 до конца.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:49  [ТС] #28
Так а где числа-то сравниваются?)
KuKu
1557 / 1035 / 77
Регистрация: 17.04.2009
Сообщений: 2,981
27.11.2011, 00:51 #29
Цитата Сообщение от student-novi4ok Посмотреть сообщение
Где происходит сравнение ?=)
Тут 4 сравнения. Есть хороший способ понять - игра называется "почувствуй себя компилятором". Нарисуйте на бумажке матрицу 3 на 3. И пробегитесь сами по циклу, все считая голове - тогда поймете.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:54  [ТС] #30
Я уже сижу считаю) понял что без этого не пойму никак)

Добавлено через 1 минуту
if (i!=0 && mas[i-1][j]<mas[i][j]) continue;
if (i!=nstr-1 && mas[i+1][j]<mas[i][j]) continue;
если выполняется первое условие, то проверка второго if и последующих уже проходить не будет? и сразу будет сnt++??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 00:54
Привет! Вот еще темы с ответами:

Подсчитать количество локальных минимумов - C++
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных...

Количество локальных минимумов в списке - C++
Всем привет, в списке нужно подсчитать кол-во локальных минимумов и вывести их. Подсчитать подсчитал, но вывести не знаю как. Помогите...

Массив: посчитать количество локальных минимумов - C++
Вот задание: Официальный язык форума - русский, задание перевести

Подсчитать количество локальных минимумов матрицы - C++
Дан двумерный массив NxN. 1. Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2011, 00:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru