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

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

Восстановить пароль Регистрация
 
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
13.12.2011, 18:51     Найти "max" среди всех локальных минимумов данной матрицы #1
Элемент МАТРИЦЫ(будь она неладна) называется локальным минимумом, если он строго меньше всех своих соседей. Найти "max" среди всех локальных минимумов данной матрицы

 Комментарий модератора 
2.9. Избегайте использования слишком большого количества смайлов в сообщениях в тематических разделах форума, а также "кричащего" выделения текста. Это никаким образом не ускорит решение вашей проблемы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2011, 18:51     Найти "max" среди всех локальных минимумов данной матрицы
Посмотрите здесь:

C++ Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей.Подсчитать количество локальных минимумов ...
C++ Поменять знак всех локальных максимумов данной матрицы на противоположный.
Поменять знак всех локальных максимумов данной матрицы на противоположный C++
C++ Найдите количество абсолютных и локальных минимумов и максимумов среди элементов одномерного массива
C++ Вывести номера всех локальных минимумов двумерного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
d3dos
0 / 0 / 0
Регистрация: 21.03.2011
Сообщений: 10
13.12.2011, 20:16     Найти "max" среди всех локальных минимумов данной матрицы #2
Начинающий кодер, покажите, пожалуйста, свои наработки для начала и что непонятно.

P.S.: Таким оформлением топика вы выказываете неуважение к остальным участникам форума.
NinGAZ
13 / 13 / 1
Регистрация: 27.07.2011
Сообщений: 162
13.12.2011, 20:18     Найти "max" среди всех локальных минимумов данной матрицы #3
соглашусь
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 11:02     Найти "max" среди всех локальных минимумов данной матрицы #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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
class ivan
{
    private:
        int N, M;
        int **matrix;
        int max;
 
    public:
 
        typedef int *intptr;
 
        void constructor( int **ar, int n, int m )
        {
            matrix = ar;
            N = n;
            M = m;
            max = 0x8000000;
        }
 
        void set ()
        {
            matrix = new intptr [ N ];
            for ( int i = 0; i < M; ++i )
                matrix[ i ] = new int[ M ];
        }
 
        void init()
        {
            ivan::set();
            for ( int i = 0; i < N; ++i )
                for ( int j = 0; j < M; ++j )
                    std::cin >> matrix[ i ][ j ];
        }
 
        void init(int begin, int end)
        {
            ivan::set();
            for ( int i = 0; i < N; ++i )
                for ( int j = 0; j < M; ++j )
                    matrix[ i ][ j ] = ( rand() % (end - begin) ) + begin;
        }
 
        void free_matrix()
        {
            for ( int i = 0; i < N; ++i )
                delete [] matrix[ i ];
            delete [] matrix;
        }
 
        void print_matrix()
        {
            for ( int i = 0; i < N; ++i )
            {
                for ( int j = 0; j < M; ++j )
                    std::cout << std::setw(3) << matrix[ i ][ j ];
                std::cout << std::endl;
            }
        }
 
        int find_min ( int i)
        {
            int min = matrix[ i ][ 0 ];
            int n;
 
            for ( int j = 0; j < M; ++j )
                if ( min >= matrix[ i ][ j ] )
                {
                    min = matrix[ i ][ j ];
                    n = j;
                }
            for ( int j = 0; j < M; ++j )
                if ( ( min == matrix[ i ][ j ] ) && ( j != n ) )
                {
                    std::cout << "в строке " << i + 1 << " минимум не является строгим " << std::endl;
                    return (0x80000000);
                }
            return min;
        }
 
        void find_num ()
        {
            int num = ivan::find_min(0);
            int t;
            for ( int i = 0; i < N; ++i )
            {
                t = ivan::find_min( i );
                if ( num <  t)
                    num = t;
            }
            ivan::max = num;
        }
 
        void give_num ()
        {
            if ( max ^ 0x80000000 )
                std::cout << "искомое число " << ivan::max << " ";
            else
                std::cout << "строгих минимумов с троках матрицы нет "<< std::endl;
        }
};
 
 
int main()
{
    ivan objct;
    int **array, n = 5, m = 5, num;
    std::srand(std::time(0));
    objct.constructor(array, n, m);
    objct.init(10, 53);
    objct.print_matrix();
    std::cout << std::endl;
    objct.find_num();
    objct.give_num();
    objct.free_matrix();
 
    return 0;
}
Добавлено через 8 часов 43 минуты
гляньте косяки, что тут не так с высоты ооп?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.12.2011, 11:12     Найти "max" среди всех локальных минимумов данной матрицы #5
Цитата Сообщение от alkagolik Посмотреть сообщение
гляньте косяки, что тут не так с высоты ооп?
а если матрицу надо в файл вывести?
вывод внутри не целевых функций, то есть find_min не должна ничего печатать
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 11:15     Найти "max" среди всех локальных минимумов данной матрицы #6
Jupiter, выход? трайкетч отдельным методом?

Добавлено через 55 секунд
Цитата Сообщение от Jupiter Посмотреть сообщение
вывод внутри не целевых функций, то есть find_min не должна ничего печатать
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.12.2011, 11:17     Найти "max" среди всех локальных минимумов данной матрицы #7
alkagolik, в функцию вывода параметром передавать поток куда выводить, а ещё лучше перегрузить оператор <<
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.12.2011, 11:21     Найти "max" среди всех локальных минимумов данной матрицы #8
Цитата Сообщение от alkagolik Посмотреть сообщение
0x8000000
С идеалогической точки зрения неправильно так работать со знаковыми числами.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 11:27     Найти "max" среди всех локальных минимумов данной матрицы #9
fasked, само собой. Написал первое что пришло на ум. А почему неправильно именно со знаковыми?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.12.2011, 11:38     Найти "max" среди всех локальных минимумов данной матрицы #10
Цитата Сообщение от alkagolik Посмотреть сообщение
А почему неправильно именно со знаковыми?
Для беззнакового 32-битного числа это нормальное значение. А для знакового не совсем. Мне кажется не совсем правильным "трогать" бит, отвечающий за смену знака числа.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
14.12.2011, 11:45     Найти "max" среди всех локальных минимумов данной матрицы #11
fasked, вроде вы что-то путаете. Для знакового это просто минимальное значение типа.
C
1
2
3
4
5
6
int main()
{
    int x = 0x7FFFFFFF;
    printf("%i  %x\n%i  %x\n", x, x, ~x, ~x);
    return 0;
}
в дополнительном коде 0 - присутствие значения в разряде, 1 - его отсутствие. Отрицательная логика.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.12.2011, 11:46     Найти "max" среди всех локальных минимумов данной матрицы #12
Цитата Сообщение от alkagolik Посмотреть сообщение
Для знакового это просто минимальное значение типа.
Я потому и написал "идеологически" Я вообще против битовых операций со знаковыми.
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
14.12.2011, 15:53  [ТС]     Найти "max" среди всех локальных минимумов данной матрицы #13
Пардон, я забыл сказать что у меня задание именно на чистом Си а не на плюсах
вот мой брутальный код, что скажите?
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <malloc.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
void* allocateMatrixMemory(unsigned int n,unsigned int m,unsigned int typeSize){
    unsigned char** bytes = (unsigned char**)malloc(sizeof(unsigned char*)*n);
    if(!bytes)
        return 0;
    for(unsigned int i = 0; i < n; i++){
        bytes[i] = (unsigned char*)malloc(typeSize*m);
        if(!bytes[i])
            return 0;
    }
    return bytes;
}
 
void freeMatrixMemory(void* matrix,unsigned int n){
    for(unsigned int i = 0; i < n; i++){
        unsigned char* data = ((unsigned char**)matrix)[i];
        free(data);
    }
    free(matrix);
}
 
void fillMatrixWithRandomNumbers(int** matrix,unsigned int n,unsigned int m,int first,int second){
 
    for(unsigned int i = 0; i<n; i++){
        for(unsigned int j = 0; j<m; j++){
            int r = rand()%(second - first) + first;
            matrix[i][j] = r;
        }
    }
}
 
int** getRandomMatrix(unsigned int n,unsigned int m,int start,int end){
    int** matrix = (int**)allocateMatrixMemory(n,m,sizeof(int));
    fillMatrixWithRandomNumbers(matrix,n,m,start,end);
    return matrix;
}
 
int getMaxLocalMatrixMinimum(int** matrix,unsigned int n,unsigned int m){
 
    int max = 0;
    for(unsigned int i = 1; i < n-1; i++){
        for(unsigned int j = 1; j < m-1; j++){
            if(matrix[i][j] <= max)
                continue;
            char check = (matrix[i][j] < matrix[i+1][j-1]) &&
                (matrix[i][j] < matrix[i-1][j-1]) &&
                (matrix[i][j] < matrix[i+1][j+1]) &&
                (matrix[i][j] < matrix[i][j-1]) &&
                (matrix[i][j] < matrix[i-1][j]) &&
                (matrix[i][j] < matrix[i+1][j]) &&
                (matrix[i][j] < matrix[i][j+1]) &&
                (matrix[i][j] < matrix[i-1][j+1]);
            if(check)
                max = matrix[i][j];
        }
    }
 
    if(matrix[0][0] > max){
        char check = matrix[0][0] < matrix[1][1] &&
                matrix[0][0] < matrix[0][1] &&
                matrix[0][0] < matrix[1][0];
        if(check)
            max = matrix[0][0];
    }
 
 
    if(matrix[n-1][m-1] > max){
        char check = matrix[n-1][m-1] < matrix[n-2][m-2] &&
                matrix[n-1][m-1] < matrix[n-1][m-2] &&
                matrix[n-1][m-1] < matrix[n-2][m-1];
        if(check)
            max = matrix[0][0];
    }
 
    if(matrix[0][m-1] > max){
        char check = matrix[0][m-1] < matrix[1][m-2] &&
                matrix[0][m-1] < matrix[0][m-2] &&
                matrix[0][m-1] < matrix[1][m-1];
        if(check)
            max = matrix[0][0];
    }
 
    if(matrix[n-1][0] > max){
        char check = matrix[n-1][0] < matrix[n-2][1] &&
                matrix[n-1][0] < matrix[n-1][1] &&
                matrix[n-1][0] < matrix[n-2][0];
        if(check)
            max = matrix[0][0];
    }
 
    for(unsigned int i = 1; i<m-1; i++){
        if(matrix[0][i] <= max)
            continue;
        char check = matrix[0][i] < matrix[0][i-1] &&
        matrix[0][i] < matrix[1][i-1] &&
        matrix[0][i] < matrix[0][i+1] &&
        matrix[0][i] < matrix[1][i+1] &&
        matrix[0][i] < matrix[1][i];
        if(check)
            max = matrix[0][i];
    }
 
//    for(unsigned int i = 1; i<n-1; i++){
//        if(matrix[0][i] <= max)
//            continue;
//       char check = matrix[i][0] < matrix[i-1][0] &&
//        matrix[i][0] < matrix[i-1][1] &&
//        matrix[i][0] < matrix[i+1][0] &&
//        matrix[i][0] < matrix[i+1][1] &&
//        matrix[i][0] < matrix[i][1];
//        if(check)
//            max = matrix[i][0];
//    }
 
    return max;
}
 
void printMatrix( int** matrix,unsigned n,unsigned int m){
    for(unsigned int i = 0; i<n; i++){
        for(unsigned int j = 0; j<m; j++)
            printf("%d ",matrix[i][j]);
        puts("");
    }
}
 
int main(){
 
    srand(time(0));
    const int n = 5;
    const int m = 5;
    int** matrix = getRandomMatrix(n,m,10,100);
    printMatrix(matrix,n,m);
    freeMatrixMemory(matrix,n);
    printf("\n%d",getMaxLocalMatrixMinimum(matrix,n,m));
    return 0;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2011, 02:28     Найти "max" среди всех локальных минимумов данной матрицы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
15.12.2011, 02:28     Найти "max" среди всех локальных минимумов данной матрицы #14
6blgJlo'KOgeP, жесть. Я сразу не заметил какой минимум надо искать, сейчас вижу. ваш подход мегабрутал. Позже напишу функцию поиска

Добавлено через 3 часа 33 минуты
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
void* allocateMatrixMemory
какого типа функция? и какой тип она возвращает. вот готовая программа
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
105
106
107
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
void *create(size_t num, size_t size)
{
    void *t = (void *) malloc ( num * size );
    if ( t == NULL )
        exit(EXIT_FAILURE);
    else
        return t;
}
 
int comp(const void *i, const void *j)
{
  return *(int *)i - *(int *)j;
}
 
char is_local_min ( int **array, int val, size_t i, size_t j, size_t n, size_t m )
{
    int row_beg = ( i ) ? i - 1 : i;
    int row_end = ( i == ( n - 1 ) ) ? i : i + 1;
    int col_beg = ( j ) ? j - 1 : j;
    int col_end = ( j == ( m - 1 ) ) ? j : j + 1;
    int row_iter, col_iter;
 
    for ( row_iter = row_beg; row_iter <= row_end; ++ row_iter )
        for ( col_iter = col_beg; col_iter <= col_end; ++col_iter )
            if ( array[ row_iter ][ col_iter ] < val )
                return 0;
            else if ( ( array[ row_iter ][ col_iter ] == val ) &&  ( row_iter ^ i ) && ( col_iter ^ j ) )
                return 0;
    return 1;
}
 
void find_max_from_localmin ( int **array, size_t n, size_t m, int *num, char *flag )
{
    int i, j;
    int cnt = 1, *t = NULL;
 
    for ( i = 0; i < n; ++i )
        for ( j = 0; j < m; ++j )
            if ( is_local_min ( array, array[ i ][ j ], i, j, n, m ) )
            {
                t = realloc ( t, cnt * sizeof( int ) );
                if ( t == NULL )
                    exit ( EXIT_FAILURE );
                else
                {
                    t[ cnt - 1 ] = array[ i ][ j ];
                    ++cnt;
                }
            }
    if ( t )
    {
        qsort ( t, --cnt, sizeof( int ), comp );
        *num = t [ --cnt ];
        *flag = 1;
    }
    else
        *flag = 0;
    free ( t );
}
 
void init_random ( int **array, size_t n, size_t m, int mod )
{
    int i = 0, j;
    for ( i; i < n; ++i )
        for ( j = 0; j < m; ++j )
            array[ i ][ j ] = rand() % mod;
}
 
main(void)
{
    size_t size = 10;
    int **matrix;
    int i = 0, j, number;
    char flag = 0;
    srand ( time ( 0 ) );
 
    matrix = (int**) create ( size, sizeof( int* ) );
    while ( i++ < size )
        matrix[ i - 1 ] = (int*) create ( size, sizeof ( int ) );
 
    init_random ( matrix, size, size, 50 );
 
    for ( i = 0; i < size; ++i )
    {
        for ( j = 0; j < size; ++j )
            printf( "%3i", matrix[ i ][ j ] );
        puts("");
    }
    puts("");
 
    find_max_from_localmin ( matrix, size, size, &number, &flag );
    if ( flag )
        printf ( "\nискомое число %i ", number );
    else
        puts("");
 
    for ( i = 0; i < size; ++i )
        free ( matrix[ i ] );
    free( matrix );
 
    exit(EXIT_SUCCESS);
}
Yandex
Объявления
15.12.2011, 02:28     Найти "max" среди всех локальных минимумов данной матрицы
Ответ Создать тему
Опции темы

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