Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
#1

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

13.12.2011, 18:51. Просмотров 788. Ответов 13
Метки нет (Все метки)

Элемент МАТРИЦЫ(будь она неладна) называется локальным минимумом, если он строго меньше всех своих соседей. Найти "max" среди всех локальных минимумов данной матрицы

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

Найти максимум среди локальных минимумов последовательности - C++
В потоке ввода данных записана последовательность целых чисел, последнее из которых 0. Найти максимум среди локальных минимумов (т.е....

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

Поменять знак всех локальных максимумов данной матрицы на противоположный - C++
Matrix75. Дана матрица размера M × N. Элемент матрицы называется ее ло-кальным максимумом, если он больше всех окружающих его элементов....

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

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

Найдите количество абсолютных и локальных минимумов и максимумов среди элементов одномерного массива - C++
Найдите количество абсолютных и локальных минимумов и максимумов среди элементов одномерного массива.

13
d3dos
0 / 0 / 0
Регистрация: 21.03.2011
Сообщений: 10
13.12.2011, 20:16 #2
Начинающий кодер, покажите, пожалуйста, свои наработки для начала и что непонятно.

P.S.: Таким оформлением топика вы выказываете неуважение к остальным участникам форума.
0
NinGAZ
14 / 14 / 1
Регистрация: 27.07.2011
Сообщений: 162
13.12.2011, 20:18 #3
соглашусь
1
alkagolik
Заблокирован
14.12.2011, 11:02 #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 минуты
гляньте косяки, что тут не так с высоты ооп?
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.12.2011, 11:12 #5
Цитата Сообщение от alkagolik Посмотреть сообщение
гляньте косяки, что тут не так с высоты ооп?
а если матрицу надо в файл вывести?
вывод внутри не целевых функций, то есть find_min не должна ничего печатать
0
alkagolik
Заблокирован
14.12.2011, 11:15 #6
Jupiter, выход? трайкетч отдельным методом?

Добавлено через 55 секунд
Цитата Сообщение от Jupiter Посмотреть сообщение
вывод внутри не целевых функций, то есть find_min не должна ничего печатать
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.12.2011, 11:17 #7
alkagolik, в функцию вывода параметром передавать поток куда выводить, а ещё лучше перегрузить оператор <<
1
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.12.2011, 11:21 #8
Цитата Сообщение от alkagolik Посмотреть сообщение
0x8000000
С идеалогической точки зрения неправильно так работать со знаковыми числами.
1
alkagolik
Заблокирован
14.12.2011, 11:27 #9
fasked, само собой. Написал первое что пришло на ум. А почему неправильно именно со знаковыми?
0
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.12.2011, 11:38 #10
Цитата Сообщение от alkagolik Посмотреть сообщение
А почему неправильно именно со знаковыми?
Для беззнакового 32-битного числа это нормальное значение. А для знакового не совсем. Мне кажется не совсем правильным "трогать" бит, отвечающий за смену знака числа.
0
alkagolik
Заблокирован
14.12.2011, 11:45 #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 - его отсутствие. Отрицательная логика.
1
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.12.2011, 11:46 #12
Цитата Сообщение от alkagolik Посмотреть сообщение
Для знакового это просто минимальное значение типа.
Я потому и написал "идеологически" Я вообще против битовых операций со знаковыми.
1
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
14.12.2011, 15:53  [ТС] #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;
0
alkagolik
Заблокирован
15.12.2011, 02:28 #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);
}
0
15.12.2011, 02:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2011, 02:28
Привет! Вот еще темы с ответами:

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

Подсчитать количество локальных минимумов матрицы - C++
Дали три задачи на зачетную. С массивами у меня более менее нормально, но вот сами задания, что от меня требуется - понять не могу. Может...

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

Подсчитать количество локальных минимумов матрицы - C++
Дано матрицу . Разделить выходную матрицу на значения y=2/x, где x=1,5. Подсчитать кол-во локальных минимумов полученной матрицы . Найти...


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

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

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