92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
1

Найти локальные минимумы в заданной квадратной матрице

11.03.2016, 18:05. Показов 761. Ответов 17
Метки нет (Все метки)

Помогите найти ошибку.
Задание:
Найти локальный минимум(это элемент, который больше всех своих соседей), вывести кол-во этих минимумов и эти элементы, собственно.
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
#include <math.h>
#include <iostream> 
#include <ctime>
 
using namespace std;
void main()
{
    setlocale(LC_ALL, "russian");
    srand((unsigned)time(NULL));
    int i, j, a[4][4];
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
            a[i][j] = rand() % 20;
    }
    cout << "Матрица до обработки: " << endl;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            cout << a[i][j] << "\t "; cout << "\n";
    }
    //=============================================//
    // Количество минимумов
    int temp;
    int n = 4;
    int k = 0;
    temp = a[i][j];
    int minimum = 0;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
        {
            if (a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j])
            {
                minimum++;
                
            }
            cout << k + 1 << "-i minimum= " << a[i][j] << endl;
        }
    minimum++;
    cout << "Kol-vo minimal elementov= " << minimum << endl;
    //=============================================//
    system("pause");
}
Благодарен заранее!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2016, 18:05
Ответы с готовыми решениями:

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

Найти локальные минимумы массива
Найти локальные минимумы массива (когда и соседний элемент слева, и соседний элемент справа от...

Найти все локальные минимумы в матрице
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него...

Найти локальные минимумы в матрице и вывести на экран
Задание звучит так: Дана целочисленная квадратная матрица. Элемент матрицы называется локальным...

17
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
11.03.2016, 18:11 2
Идея правильная, только на краях проверять не надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int minimum = 0;
int k=0;
for (int i = 1; i < n-1; ++i)
{
        for (int j = 1; j < n-1; ++j)
       {
            if (a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j])
            {
                minimum++;
                cout << k + 1 << "-i minimum= " << a[i][j] << endl;
                k++;
            }
        }
}
cout << "Kol-vo minimal elementov= " << minimum << endl;
1
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
11.03.2016, 18:17  [ТС] 3
Упс, благодарю, совсем забыл об этом, моя глупость.
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
11.03.2016, 18:19 4
Цитата Сообщение от fleqfvkb Посмотреть сообщение
temp = a[i][j];
1. i,j здесь за границами массива
2. А зачем вообще Вы это написали?
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
11.03.2016, 18:20  [ТС] 5
И все равно, он ищет не все..
Название: PYPtJj7.jpg
Просмотров: 32

Размер: 21.0 Кб
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
11.03.2016, 19:31  [ТС] 6
Цитата Сообщение от zss Посмотреть сообщение
1. i,j здесь за границами массива
2. А зачем вообще Вы это написали?
Это я пытался красиво оформить, но потом забил и забыл удалить в дальнейшем..

Добавлено через 22 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    bool fl;
    for (i = 0; i<n; i++)
        for (j = 0; j<n; j++)
        {
            fl = true;
            if (i>0 && a[i - 1][j] <= a[i][j])
                fl = false;
            if (j>0 && a[i][j - 1] <= a[i][j])
                fl = false;
            if (i<n - 1 && a[i + 1][j] <= a[i][j])
                fl = false;
            if (j<n - 1 && a[i][j + 1] <= a[i][j])
                fl = false;
            if (fl)
                col++;
        }
Как вариант рабочий, только мне нужно, как через мой цикл, у кого-нибудь есть варианты?

Добавлено через 46 минут
????
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
11.03.2016, 21:24 7
Это ничем не лучше предложенного мною варианта.
Если нужно учесть минимумы на рамке, то их придется пройти 4 отдельными циклами типа
C++
1
2
3
4
5
6
7
for (j = 1; j<n-1; j++)
      if (a[0][j-1] <= a[0][j] && a[0][j+1] <= a[0][j]  && a[1][j] <= a[0][j] )
      {
             minimum++;
             cout << k + 1 << "-i minimum= " << a[0][j] << endl;
             k++;
      }
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 10:31  [ТС] 8
Цитата Сообщение от zss Посмотреть сообщение
Это ничем не лучше предложенного мною варианта.
Если нужно учесть минимумы на рамке, то их придется пройти 4 отдельными циклами типа
Все равно не хочет считать, если я правильно понял, то алгоритм сам таков:
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
int n = 10;
    int min = 0;
    int ni = 0;
    int k = 0;
    for (int i = 1; i < n - 1; ++i)
    {
        for (int j = 1; j < n - 1; ++j)
        {
            if ((a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j]) 
||
                (a[0][j - 1] <= a[0][j] && a[0][j + 1] <= a[0][j] && a[1][j] <= a[0][j])
                ||
                (a[i - 1][0] <= a[i][0] && a[i + 1][0] <= a[i][0] && a[i][1] <= a[i][0]))
            {
                min++;
                cout << ni + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                ni++;
            }
        }
    }
    cout << "Кол-во минимумов: " << min << endl;
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
12.03.2016, 10:44 9
Строки 13-16 удалите.
А после строки 23 добавьте 4 раза код, который я привел в сообщении №7
(для каждой из границ).
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 10:55  [ТС] 10
Цитата Сообщение от zss Посмотреть сообщение
Строки 13-16 удалите.
А после строки 23 добавьте 4 раза код, который я привел в сообщении №7
(для каждой из границ).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (j = 1; j<n - 1; j++)
        if (a[0][j - 1] <= a[0][j] && a[0][j + 1] <= a[0][j] && a[1][j] <= a[0][j])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[0][j] << endl;
            k++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][0] <= a[i][0] && a[i + 1][0] <= a[i][0] && a[i][1] <= a[i][0])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[0][j] << endl;
            k++;
        }
А какие еще 2 цикла нужны?
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
12.03.2016, 10:57 11
1. верхняя строка
2. нижняя строка
3. левый столбец
4. правый столбец
1
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 11:24  [ТС] 12
Цитата Сообщение от zss Посмотреть сообщение
1. верхняя строка
2. нижняя строка
3. левый столбец
4. правый столбец
Вроде как есть левый столбец и верхняя строка, а вот вторые 2 не получается почему-то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (i = 1; i < n - 1; i++)
        if (a[i + 1][4] <= a[i][4] && a[i - 1][4] <= a[i][4] && a[i][3] <= a[i][4])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[i][4] << endl;
            k++;
        }
    for (j = 1; j < n - 1; j++)
        if (a[4][j + 1] <= a[4][j] && a[4][j - 1] <= a[4][j] && a[3][j] <= a[4][j])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[4][j] << endl;
            k++;
        }
Добавлено через 7 минут
Не тот код, вот тот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    for (i = 3; i > n - 1; i--)
        if (a[i + 1][4] <= a[i][4] && a[i - 1][4] <= a[i][4] && a[i][3] <= a[i][4])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[i][4] << endl;
            k++;
        }
    for (j = 3; j > n - 1; j--)
        if (a[4][j + 1] <= a[4][j] && a[4][j - 1] <= a[4][j] && a[3][j] <= a[4][j])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[4][j] << endl;
            k++;
        }
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
12.03.2016, 12:12 13
Тут же ничего сложного, ноль меняем на n-1, единицу - на n-2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (j = 1; j<n - 1; j++)
        if (a[n-1][j - 1] <= a[n-1][j] && a[n-1][j + 1] <= a[n-1][j] && a[n-2][j] <= a[n-1][j])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[n-1][j] << endl;
            k++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][n-1] <= a[i][n-1] && a[i + 1][n-1] <= a[i][n-1] && a[i][n-2] <= a[i][n-1])
        {
            min++;
            cout << k + 1 << "-i minimum= " << a[n-1][j] << endl;
            k++;
        }
1
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 12:46  [ТС] 14
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
    for (int i = 1; i < n - 1; ++i)
    {
        for (int j = 1; j < n - 1; ++j)
        {
            if (a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
        }
    }
    for (j = 1; j<n - 1; j++)
        if (a[0][j - 1] <= a[0][j] && a[0][j + 1] <= a[0][j] && a[1][j] <= a[0][j])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][0] <= a[i][0] && a[i + 1][0] <= a[i][0] && a[i][1] <= a[i][0])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (j = 1; j<n - 1; j++)
        if (a[n - 1][j - 1] <= a[n - 1][j] && a[n - 1][j + 1] <= a[n - 1][j] && a[n - 2][j] <= a[n - 1][j])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][n - 1] <= a[i][n - 1] && a[i + 1][n - 1] <= a[i][n - 1] && a[i][n - 2] <= a[i][n - 1])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
Сделал проверку 2-х алгоритмов, итог ниже:
Найти локальные минимумы в заданной квадратной матрице

Полный код программы, если нужен..
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <math.h>
#include <iostream> 
#include <ctime>
 
using namespace std;
int k = 0;
void main()
{
    setlocale(LC_ALL, "russian");
    srand((unsigned)time(NULL));
    int i, j, a[4][4];
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
            a[i][j] = rand() % 20;
    }
    cout << "Матрица до обработки: " << endl;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            cout << a[i][j] << "\t "; cout << "\n";
    }
    //=============================================//
    // Количество минимумов
    int n = 4;
    int k = 0;
    int minimum = 0;
    
    for (int i = 1; i < n - 1; ++i)
    {
        for (int j = 1; j < n - 1; ++j)
        {
            if (a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
        }
    }
    for (j = 1; j<n - 1; j++)
        if (a[0][j - 1] <= a[0][j] && a[0][j + 1] <= a[0][j] && a[1][j] <= a[0][j])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][0] <= a[i][0] && a[i + 1][0] <= a[i][0] && a[i][1] <= a[i][0])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (j = 1; j<n - 1; j++)
        if (a[n - 1][j - 1] <= a[n - 1][j] && a[n - 1][j + 1] <= a[n - 1][j] && a[n - 2][j] <= a[n - 1][j])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
    for (i = 1; i<n - 1; i++)
        if (a[i - 1][n - 1] <= a[i][n - 1] && a[i + 1][n - 1] <= a[i][n - 1] && a[i][n - 2] <= a[i][n - 1])
        {
            cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
            k++;
            minimum++;
        }
 
    cout << "Kol-vo minimal elementov= " << minimum << endl;
    ////////////////////////////////////////////////////////
    int min = 0;
    int ni = 0;
    bool f;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
        {
            f = true;
            if (i > 0 && a[i - 1][j] <= a[i][j])
                f = false;
            if (j > 0 && a[i][j - 1] <= a[i][j])
                f = false;
            if (i < n - 1 && a[i + 1][j] <= a[i][j])
                f = false;
            if (j < n - 1 && a[i][j + 1] <= a[i][j])
                f = false;
            if (f)
            {
 
                cout << ni + 1 << "KEKEEKE-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                ni++;
                min++;
            }
        }
    cout << "===========================================================================" << endl;
    cout << "Кол-во минимумов: " << min << endl;
    cout << "===========================================================================" << endl;
 
    //=============================================//
    system("pause");
}
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 14:42  [ТС] 15
Кто-нибудь знает, в чем ошибка?
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
12.03.2016, 14:46 16
fleqfvkb, Почему бы Вам не воспользоваться отладчиком:
Как пользоваться отладчиком (в Visual Studio)

Кстати, а почему Вы отдельно считаете количество минимумов на границе и внутри?
0
92 / 81 / 57
Регистрация: 19.02.2016
Сообщений: 336
12.03.2016, 15:21  [ТС] 17
Цитата Сообщение от zss Посмотреть сообщение
fleqfvkb, Почему бы Вам не воспользоваться отладчиком:
Как пользоваться отладчиком (в Visual Studio)
Кстати, а почему Вы отдельно считаете количество минимумов на границе и внутри?
Ошибка в алгоритме, а не в синтаксисе
Цитата Сообщение от zss Посмотреть сообщение
Это ничем не лучше предложенного мною варианта.
Если нужно учесть минимумы на рамке, то их придется пройти 4 отдельными циклами типа
Вы сами написали, пройтись 4-мя отдельными циклами..

Добавлено через 8 минут
Написал в одном цикле, результата ноль или вы что-то другое в виду имели?
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
    for (int i = 1; i < n - 1; ++i)
    {
        for (int j = 1; j < n - 1; ++j)
        {
            // 1
            if (a[0][j - 1] <= a[0][j] && a[0][j + 1] <= a[0][j] && a[1][j] <= a[0][j])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
            //2
            if (a[i - 1][0] <= a[i][0] && a[i + 1][0] <= a[i][0] && a[i][1] <= a[i][0])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
            //3
            if (a[n - 1][j - 1] <= a[n - 1][j] && a[n - 1][j + 1] <= a[n - 1][j] && a[n - 2][j] <= a[n - 1][j])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
            //4
            if (a[i - 1][n - 1] <= a[i][n - 1] && a[i + 1][n - 1] <= a[i][n - 1] && a[i][n - 2] <= a[i][n - 1])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
            //5
            if (a[i][j] < a[i][j - 1] &&
                a[i][j] < a[i][j + 1] &&
                a[i][j] < a[i - 1][j] &&
                a[i][j] < a[i + 1][j])
            {
                cout << k + 1 << "-й элемент : " << a[i][j] << " \tСтрока : " << i + 1 << " \tСтолбик : " << j + 1 << endl;
                k++;
                minimum++;
            }
 
 
        }
    }
0
Модератор
Эксперт С++
12437 / 10003 / 6022
Регистрация: 18.12.2011
Сообщений: 26,777
12.03.2016, 18:31 18
fleqfvkb, Вы когда код пишете, держите ли в голове алгоритм?
1. Счетчик минимумов равен нулю
2. Пройтись по всей внутренности и посчитать количество минимумов
3. Пройтись по каждой из границ и ДОБАВИТЬ найденное количество минимумов
4. ТОЛЬКО ТЕПЕРЬ вывести результат
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2016, 18:31
Помогаю со студенческими работами здесь

Найти все локальные минимумы массива A[1…20]
Найти все локальные минимумы массива A. Локальные минимумы – это элементы массива, которые меньше...

В заданной квадратной матрице найти наибольший элемент
В данной квадратной матрице найти наибольший элемент и перемножить попарно элементы строки, в...

Найти все локальные минимумы и максимумы в заданном массиве
В университете задали написать программу, уже не первую неделю над ней бьюсь. Тема: одномерные...

В заданной квадратной матрице порядка n найти наименьший элемент
В данной квадратной матрице порядка n найти наименьший элемент. Получить квадратную матрицу порядка...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru