0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
1

Найти минимальный из неповторяющихся элементов матрицы

27.09.2016, 19:39. Показов 1002. Ответов 9

Author24 — интернет-сервис помощи студентам
Проблема на этапе поиска неповторяющихся элементов. Ищет только по строкам, а не во всем массиве. Подскажите пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void notrepeating(char **a)
{
    for (int i = 0; i < M; i++)
    {       
        for (int j = 0; j < N; j++)
        {
            int f = 1;
            for (int k = j+1; k < N; k++)
            {   
                if ( a[i][j] == a[i][k] && j != k) 
                {
                    f = 0;
                    break;
                }
            }
            if (f == 1) printf("%c\t", a[i][j]);
        }
        printf("\n");
 
    }
    
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2016, 19:39
Ответы с готовыми решениями:

Объясните алгоритм как найти минимальный из неповторяющихся элементов матрицы
Читал подобною тему, не могу понять сам алгоритм

Найти минимальный из неповторяющихся элементов двумерного массива
Найти минимальный из неповторяющихся элементов двумерного массива. Массив организовал, как найти...

Найти минимальный из неповторяющихся элементов двумерного массива
Найти минимальный из неповторяющихся элементов двумерного массива.

В последовательности С среди неповторяющихся элементов найти минимальный и максимальный
Дана матрица. Сформировать из элементов главной диагонали линейный массив В, а из элементов...

9
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.09.2016, 20:09 2
Цитата Сообщение от Haifisch415 Посмотреть сообщение
Ищет только по строкам, а не во всем массиве.
Естественно!
Воспользуйтесь отладкой и пройдитесь по шагам. Посмотрите, что получается.
Другой путь. Возьмите небольшую матрицу 2 х 3, заполните ее. И руками прокрутите работу вашей программы.
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 20:53 3
Так лучше:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void notrepeating(char **a)
{
    for (int i = 0; i < M; i++)
    {       
        for (int j = 0; j < N; j++)
        {
            int count = 0;
            for (int k = j+1; k < N; k++)
            {   
                if ( a[i][j] == a[i][k]) 
                    count++;
            }
            if (count == 0) printf("%c\t", a[i][j]);
        }
        printf("\n");
 
    }
    
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.09.2016, 21:11 4
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Так лучше:
Не намного. Все равно только по строкам.
Более того. Для строки 1 2 3 1 2 3-й(1) и 4-й(2) окажутся уникальными.
Попробуйте.
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 21:17 5
Извините я немного напутал. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void notrepeating(char **a)
{
    for (int i = 0; i < M; i++)
    {       
        for (int j = 0; j < N; j++)
        {
            int count = 0;
            for (int k = 0; k < N; k++)
            {   
                if ( a[i][j] == a[i][k]) 
                    count++;
            }
            if (count == 0) printf("%c\t", a[i][j]);
        }
        printf("\n");
 
    }
    
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.09.2016, 21:22 6
Цитата Сообщение от Invader0x7F Посмотреть сообщение
немного напутал.
Час от часу не легче. Теперь ни один элемент не будет уникальным.
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 21:24 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void notrepeating(char **a)
{
    for (int i = 0; i < M; i++)
    {       
        for (int j = 0; j < N; j++)
        {
            int count = 0;
            for (int k = 0; k < N; k++)
            {   
                if ( a[i][j] == a[i][k] && j != k) 
                    count++;
            }
            if (count == 0) printf("%c\t", a[i][j]);
        }
        printf("\n");
 
    }
    
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.09.2016, 21:53 8
Invader0x7F, ну чтож, уникальности в строке вы добились. Т.е. почти вернулись к стартовому коду. Немного улучшили даже. Проблема со всей матрицей, однако, осталась.

Добавлено через 6 минут
Можно воспользоваться тем, что значений символа char всего 256.
C++
1
2
3
4
5
6
7
8
9
10
11
void notrepeating(char **a)
{   char sk[256]
    memset(sk, 0, 256);
    for (int i = 0; i < M; i++)   {       
        for (int j = 0; j < N; j++)    {
           unsigned char c = (unsigned char)a[i][j];
           if (sk[c]<2) sk[c]++;
        }
    }
    for(i=0; i<256; i++) if(sk[i]==1) printf("%c ", sk[i]);    
}
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
28.09.2016, 00:16 9
громоздкий и не самый эффективный вариант, но вполне себе рабочий

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
// найти минимальный из не повторяющихся элементов матрицы
 
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
 
//=======================================================================
int main ()
{
    std::vector<int> matrMain,
                     matrMin;
    std::vector<bool> matrUnique;
    int rows, columns;
 
    std::cout << "Input number of rows and columns: ";
    if (!(std::cin >> rows >> columns) ||
        (rows < 2 || columns < 2))
    {
        std::cout << "Bad input" << std::endl;
        return 1;
    }
 
    matrMain.resize(rows * columns);
    matrUnique.resize(matrMain.size(), false);
    
    std::random_device rd;
    std::default_random_engine dre(rd());
    std::uniform_int_distribution<> distr(0, matrMain.size());
 
    for (auto it = matrMain.begin(), itend = matrMain.end();
         it != itend; ++it)
        *it = distr(dre);
 
    std::cout << "\nMain matrix:" << std::endl;
    for (size_t j = 0; j != matrMain.size(); ++j)
    {
        std::cout << matrMain[j] << " ";
        if (!((j + 1) % columns))
            std::cout << std::endl;
    }
    std::cout << std::endl;
 
    for (size_t j = 0; j != matrMain.size(); ++j)
    {
        if (!matrUnique[j])
        {
            auto it = std::find(matrMain.cbegin() + j + 1, matrMain.cend(), *(matrMain.cbegin() + j));
            if (it != matrMain.cend())
            {
                matrUnique[j] = true;
                while (it != matrMain.cend())
                {
                    matrUnique[it - matrMain.cbegin()] = true;
                    it = std::find(it + 1, matrMain.cend(), *it);
                }
            }
        }
    }
 
    auto it = std::find(matrUnique.cbegin(), matrUnique.cend(), false);
    while (it != matrUnique.cend())
    {
        matrMin.push_back(matrMain[it - matrUnique.cbegin()]);
        it = std::find(it + 1, matrUnique.cend(), false);
    }
 
    if (!matrMin.empty())
        std::cout << "Result: " << *std::min_element(matrMin.cbegin(), matrMin.cend());
    else
        std::cout << "No unique elements in main matrix";
 
    std::cout << std::endl;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
02.10.2016, 16:19  [ТС] 10
Решила так, из минимумов в стоках сформировала массив и в нем нашла еще минимум.
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
char notrepeating(char **a)
{
    char *min = new char [M];
    int count = 0;
    char m = min[0];
    for (int i = 0; i < N; i++)
    {
        min[i] = a[i][0];
        for (int j = 0; j < M; j++)
        {
            
            for (int k = 0; k < M; k++)
            {
                if ((a[i][j] == a[i][k]) && (j != k))
                        count++;
            }
            if (count == 0)
                printf("%c\t", a[i][j]);
            if (a[i][j] < min) min[i] = a[i][j];
            
        }
        printf("\n");
        if (min[i] < m) m = min[i];
    }
    printf("\nmin=");
    return m;
}
0
02.10.2016, 16:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2016, 16:19
Помогаю со студенческими работами здесь

Найти максимальный и минимальный элементы среди неповторяющихся чисел
дан целочисленный массив X=(x1,x2,...xn), в котором могут быть одинаковые числа. Найти...

Найти сумму строк матрицы, среднее значение элементов матрицы и минимальный элемент
Сумма строк (сделать это все в Паскаль) Задана двумерная матрица размером 10х10 элементов,...

Найти минимальный среди максимальных элементов строк матрицы и добавить его к максимальному по ABS элементу матрицы
Найти минимальный среди максимальных элементов строк матрицы и добавить его к максимальному по ABS...

Найти минимальный из положительных элементов матрицы и произведение нечетных элементов
=Найти минимальный из положительных элементов матрицы и произведение нечетных элементов.

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

Посчитать количество неповторяющихся элементов матрицы
Задана матрица размером N´M. Определить количество различных значе-ний матрицы, т.е. повторяющиеся...


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

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

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