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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.83
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
22.11.2011, 19:36     Найти количество локальных минимумов в матрице #1
Можете подсказать как найти кол-во локальных минимумов в двумерном массиве?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2011, 19:36     Найти количество локальных минимумов в матрице
Посмотрите здесь:

Подсчитать количество локальных минимумов в матрице C++
Массив: посчитать количество локальных минимумов C++
C++ Подсчитать количество локальных минимумов
C++ Определение количества локальных минимумов в заданной матрице. Нахождение суммы модулей элементов
C++ Найти количество локальных минимумов в одномерном массиве
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VMV
8 / 8 / 0
Регистрация: 08.10.2011
Сообщений: 28
22.11.2011, 19:40     Найти количество локальных минимумов в матрице #2
Перебирай все элементы и каждый проверяй, является ли он минимумом, если да - к счетчику +1
mc.Duck
Заблокирован
22.11.2011, 19:46     Найти количество локальных минимумов в матрице #3
student-novi4ok, что за локальный минимум? приведи пример)
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
22.11.2011, 19:53  [ТС]     Найти количество локальных минимумов в матрице #4
1 2 3 4
5 6 7 2
то, что выделено жирным, это локальные минимумы
элемент называется локальным, если он строго меньше имеющихся у него соседей.
Сыроежка
Заблокирован
22.11.2011, 19:56     Найти количество локальных минимумов в матрице #5
Цитата Сообщение от student-novi4ok Посмотреть сообщение
1 2 3 4
5 6 7 2
то, что выделено жирным, это локальные минимумы
элемент называется локальным, если он строго меньше имеющихся у него соседей.
Правильно ли я понял, что, например, в следующем одномерном массиве

{ 10, 11, 1, 2 , 3 }

10 и 1 - это два локальных минимума?
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
22.11.2011, 19:57  [ТС]     Найти количество локальных минимумов в матрице #6
В одномерном, не знаю, т.к. на сколько я понял, то локальные минимумы бывают только в матрицах
Сыроежка
Заблокирован
22.11.2011, 20:00     Найти количество локальных минимумов в матрице #7
Цитата Сообщение от student-novi4ok Посмотреть сообщение
В одномерном, не знаю, т.к. на сколько я понял, то локальные минимумы бывают только в матрицах
А с каких это пор одномерный массив не является матрицей?!
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
22.11.2011, 20:20  [ТС]     Найти количество локальных минимумов в матрице #8
ну матрица это вроде двумерный только, хотя в этом пока не профи=) может и не прав. а так да, поняли правильно

Добавлено через 17 минут
Сможете помочь, я так-то представляю как делать, но не понимаю как сделать в цикле проверку одного элемента с соседними?
mc.Duck
Заблокирован
22.11.2011, 21:15     Найти количество локальных минимумов в матрице #9
student-novi4ok, я понял твою задачу, и, надеюсь, что правильно:
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
#include <iostream>
#include <clocale>
#include <string>
#include <iomanip>
using namespace std;
 
     const int n=4; //размерность матрицы(лучше будем пользоваться квадратной, чтоб голову зря не ломать)
    
     int main()
     {
         setlocale(LC_ALL,"Russian");
         int mat[n][n];
         for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         mat[j][i]=rand() % 9+5;
         
         
         for(int i=1;i<=n;i++)
         {
         for(int j=1;j<=n;j++)
         cout<<setw(4)<<mat[j][i];
         cout<<endl;
         }
         
         cout<<endl;cout<<endl;
         for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         {
         bool left=true;                             //соседи элемента с четырех его сторон
         bool right=true;
         bool up=true;
         bool down=true;
         /////////////////////
         bool nb_left=true;                       //по умолчанию, все соседи больше элемента
         bool nb_right=true;
         bool nb_up=true;
         bool nb_down=true;
         /////////////////////
         if(j==1) left=false;                      //проверяем есть ли у элемента соседи с четырех его сторон
         if(j==n) right=false; 
         if(i==1) up=false; 
         if(i==n) down=false; 
         /////////////////////
         if(left==true) if(mat[j-1][i]>mat[j][i]) nb_left=false;       //проверяем на валидность соседа и его значение
         if(right==true) if(mat[j+1][i]>mat[j][i]) nb_right=false;
         if(up==true) if(mat[j][i-1]>mat[j][i]) nb_up=false;
         if(down==true) if(mat[j][i+1]>mat[j][i]) nb_down=false;
         
         if(nb_left==true && nb_right==true && nb_up==true && nb_down==true) cout<<"> Число "<<mat[j][i]<<"  -  X-координата: "<<j<<"    Y-координата: "<<i<<endl;       // ...и если все соседи меньше, то выводим этот элемент...
         }
         cout<<endl;cout<<endl;
         
//cin.get();
system("Pause");
 }
P.S Хотел через классы, но передумал - слишком уж мудрено бы получилось...
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
22.11.2011, 22:00     Найти количество локальных минимумов в матрице #10
масивы с нуля как бэ) Про локальные переменные и отсутствие брейка, при не выполнение условия, можно пока молчать.
mc.Duck
Заблокирован
22.11.2011, 22:09     Найти количество локальных минимумов в матрице #11
KuKu, а зачем мне глобальные переменные, если они используются только в цикле?
Да и на Break особо много времени в моем случае не сыкономишь...не несите ересь)))
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
22.11.2011, 22:13     Найти количество локальных минимумов в матрице #12
И без локальных и без глобальных. А брейк из чувства прекрасного. Но это мелочи, есть по-важнее:
int mat[n][n];
for(int i=1;i<=n;i++)
от нуля до n-1
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
23.11.2011, 00:18  [ТС]     Найти количество локальных минимумов в матрице #13
Цитата Сообщение от mc.Duck Посмотреть сообщение
student-novi4ok, я понял твою задачу, и, надеюсь, что правильно:
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
#include <iostream>
#include <clocale>
#include <string>
#include <iomanip>
using namespace std;
 
     const int n=4; //размерность матрицы(лучше будем пользоваться квадратной, чтоб голову зря не ломать)
    
     int main()
     {
         setlocale(LC_ALL,"Russian");
         int mat[n][n];
         for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         mat[j][i]=rand() % 9+5;
         
         
         for(int i=1;i<=n;i++)
         {
         for(int j=1;j<=n;j++)
         cout<<setw(4)<<mat[j][i];
         cout<<endl;
         }
         
         cout<<endl;cout<<endl;
         for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
         {
         bool left=true;                             //соседи элемента с четырех его сторон
         bool right=true;
         bool up=true;
         bool down=true;
         /////////////////////
         bool nb_left=true;                       //по умолчанию, все соседи больше элемента
         bool nb_right=true;
         bool nb_up=true;
         bool nb_down=true;
         /////////////////////
         if(j==1) left=false;                      //проверяем есть ли у элемента соседи с четырех его сторон
         if(j==n) right=false; 
         if(i==1) up=false; 
         if(i==n) down=false; 
         /////////////////////
         if(left==true) if(mat[j-1][i]>mat[j][i]) nb_left=false;       //проверяем на валидность соседа и его значение
         if(right==true) if(mat[j+1][i]>mat[j][i]) nb_right=false;
         if(up==true) if(mat[j][i-1]>mat[j][i]) nb_up=false;
         if(down==true) if(mat[j][i+1]>mat[j][i]) nb_down=false;
         
         if(nb_left==true && nb_right==true && nb_up==true && nb_down==true) cout<<"> Число "<<mat[j][i]<<"  -  X-координата: "<<j<<"    Y-координата: "<<i<<endl;       // ...и если все соседи меньше, то выводим этот элемент...
         }
         cout<<endl;cout<<endl;
         
//cin.get();
system("Pause");
 }
P.S Хотел через классы, но передумал - слишком уж мудрено бы получилось...
Огромное спасибо, а на счет классов, хорошо что без них)) пока не проходили)
mc.Duck
Заблокирован
23.11.2011, 10:53     Найти количество локальных минимумов в матрице #14
KuKu, ничего в этом страшного нет! В C++ размерность можно задавать от единицы до n

Добавлено через 47 секунд
student-novi4ok, пожалуйста)
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
23.11.2011, 20:27     Найти количество локальных минимумов в матрице #15
Скажите об этом Страуструпу.
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
26.11.2011, 22:57  [ТС]     Найти количество локальных минимумов в матрице #16
Цитата Сообщение от KuKu Посмотреть сообщение
Скажите об этом Страуструпу.
Я конечно извиняюсь, но у меня появилась проблема, мы еще булевский тип не проходили, я почитал все понял, но преподаватель требует сделать без булевского типа, не могли бы вы помочь мне сделать простым перебором?
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
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
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
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-а.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 00:10     Найти количество локальных минимумов в матрице
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
student-novi4ok
4 / 4 / 1
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:10  [ТС]     Найти количество локальных минимумов в матрице #20
Вроде не должно, ведь breakи стоят

Добавлено через 2 минуты
здесь проверка всего массива?) просто щас попробовал из 4 локмин вывел только один)
Yandex
Объявления
27.11.2011, 00:10     Найти количество локальных минимумов в матрице
Ответ Создать тему
Опции темы

Текущее время: 13:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru