Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.83
student-novi4ok
4 / 4 / 3
Регистрация: 05.09.2011
Сообщений: 113
#1

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

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

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

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

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

Найти количество локальных минимумов в двумерном массиве
Нужно найти локальные минимумы в двумерном массиве и посчитать их количество....

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

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

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

{ 10, 11, 1, 2 , 3 }

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

Добавлено через 17 минут
Сможете помочь, я так-то представляю как делать, но не понимаю как сделать в цикле проверку одного элемента с соседними?
0
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 Хотел через классы, но передумал - слишком уж мудрено бы получилось...
1
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
22.11.2011, 22:00 #10
масивы с нуля как бэ) Про локальные переменные и отсутствие брейка, при не выполнение условия, можно пока молчать.
0
mc.Duck
Заблокирован
22.11.2011, 22:09 #11
KuKu, а зачем мне глобальные переменные, если они используются только в цикле?
Да и на Break особо много времени в моем случае не сыкономишь...не несите ересь)))
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
22.11.2011, 22:13 #12
И без локальных и без глобальных. А брейк из чувства прекрасного. Но это мелочи, есть по-важнее:
int mat[n][n];
for(int i=1;i<=n;i++)
от нуля до n-1
1
student-novi4ok
4 / 4 / 3
Регистрация: 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 Хотел через классы, но передумал - слишком уж мудрено бы получилось...
Огромное спасибо, а на счет классов, хорошо что без них)) пока не проходили)
0
mc.Duck
Заблокирован
23.11.2011, 10:53 #14
KuKu, ничего в этом страшного нет! В C++ размерность можно задавать от единицы до n

Добавлено через 47 секунд
student-novi4ok, пожалуйста)
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
23.11.2011, 20:27 #15
Скажите об этом Страуструпу.
1
student-novi4ok
4 / 4 / 3
Регистрация: 05.09.2011
Сообщений: 113
26.11.2011, 22:57  [ТС] #16
Цитата Сообщение от KuKu Посмотреть сообщение
Скажите об этом Страуструпу.
Я конечно извиняюсь, но у меня появилась проблема, мы еще булевский тип не проходили, я почитал все понял, но преподаватель требует сделать без булевского типа, не могли бы вы помочь мне сделать простым перебором?
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
26.11.2011, 23:15 #17
Не могли, если вы поняли логику, то переделать ее можно на раз. Если что-то непонятно - спрашивайте.
1
student-novi4ok
4 / 4 / 3
Регистрация: 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);
}
Мой код, тут пока поиск не по всем элементам, но мне кажется что это все не правильно)
0
KuKu
1559 / 1037 / 93
Регистрация: 17.04.2009
Сообщений: 2,995
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-а.
1
student-novi4ok
4 / 4 / 3
Регистрация: 05.09.2011
Сообщений: 113
27.11.2011, 00:10  [ТС] #20
Вроде не должно, ведь breakи стоят

Добавлено через 2 минуты
здесь проверка всего массива?) просто щас попробовал из 4 локмин вывел только один)
0
27.11.2011, 00:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 00:10
Привет! Вот еще темы с решениями:

Определение количества локальных минимумов в заданной матрице. Нахождение суммы модулей элементов
Здравствуйте! Прошу помощи в лабораторной работе. Задание: 1. ...

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

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

Подсчитать количество локальных минимумов матрицы
Элементы матрицы могут быть любого типа с плавающей точкой.Размещение матрицы в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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