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

Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов - C++

Восстановить пароль Регистрация
 
Georguy
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 33
09.05.2014, 16:32     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов #1
Всем привет! Нужна помощь в следующем задании: дана целочисленная прямоугольная матрица, определить номер строки с самой длинной серией одинаковых элементов.
Нужна программа для общего случая, т.е., если самая длинная последовательность встречается в нескольких строках, то ответом должны быть номера этих строк, а не только номер первой встречающейся из них. Вот мой код, только для случая, если существует только одна такая строка:
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
#include <iostream>
#include <limits>
#include <time.h>
 
using namespace std;
 
bool nomer_stroki(int **matriza, int &nomer_strochki, int chislo_strok, int chislo_stolbcov);
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    int chislo_strok, chislo_stolbcov;
 
    int kolvo_stolbcov;
    int nomer_strochki;
 
    srand(time(NULL));
 
    cout << "Введите число строк " << endl;
    cin >> chislo_strok;
    while (cin.fail() || chislo_strok <= 0)
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Вы ввели неправильное число строк" << endl;
        cin >> chislo_strok;
    }
 
    cout << "Введите число столбцов " << endl;
    cin >> chislo_stolbcov;
    while (cin.fail() || chislo_stolbcov <= 0)
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Вы ввели неправильное число столбцов" << endl;
        cin >> chislo_stolbcov;
    }
 
    int **matriza;
    matriza = new int*[chislo_strok];
 
    for (int i = 0; i < chislo_strok; i++)
        matriza[i] = new int[chislo_stolbcov];
 
    cout << endl;
 
    for (int i = 0; i < chislo_strok; i++)
    {
        for (int j = 0; j < chislo_stolbcov; j++)
        {
            matriza[i][j] = rand() % 10;
            cout << matriza[i][j] << " ";
        }
        cout << endl;
    }
 
    if (nomer_stroki(matriza, nomer_strochki, chislo_strok, chislo_stolbcov))
        cout << "Номер строки, в которой находится самая длинная серия одинаковых элементов: " << nomer_strochki+1 << endl;
    else
        cout << "Cерий одинаковых элементов нет" << endl;
 
    for (int i = 0; i < chislo_strok; i++)
        delete[] matriza[i];
    delete[]matriza;
 
    system("Pause");
    return 0;
}
 
 
bool nomer_stroki(int **matriza, int &nomer_strochki, int chislo_strok, int chislo_stolbcov)
{
    nomer_strochki = 0;
    bool value = true;
    int dlina_pocledovatelnosti;
    int pred_podschet = 0;
 
    for (int i = 0; i < chislo_strok; i++)
        for (int j = 0; j < chislo_stolbcov - 1; j++)
        {
            dlina_pocledovatelnosti = 0;
            if (matriza[i][j] == matriza[i][j + 1])
                while (matriza[i][j] == matriza[i][j + 1])
                {
                    dlina_pocledovatelnosti++;
                    j++;
                }
                if (dlina_pocledovatelnosti > pred_podschet)
                {
                    nomer_strochki = i;
                    pred_podschet = dlina_pocledovatelnosti;
                }
        }
    if (pred_podschet == 0)
        value = false;
    return value;
}
P.s.: возможно вознаграждение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 16:32     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов
Посмотрите здесь:

C++ Вывести номер строки матрицы с самой длинной последовательностью одинаковых элементов
C++ Нахождение номера столбца с максимальной серией одинаковых элементов в двумерном массиве
C++ Дана целочисленная прямоугольная матрица. Определить номер строки, в которой находится самая длинная серия одинаковых элементов
C++ Переделать функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки и воспроизводила ее
C++ Двумерный массив: найти номер строки, в которой находится самое минимальное количество одинаковых элементов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,536
09.05.2014, 17:57     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов #2
Создай массив с количеством элементов = chislo_strok и сохраняй туда длины найденных последовательностей для каждой строки.
Georguy
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 33
09.05.2014, 18:18  [ТС]     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов #3
nmcf, Вот у меня была такая же идея, только не знаю, как именно ее реализовать
может быть фрагмент кода напишите, пожалуйста?

Добавлено через 5 минут
nmcf, не подскажете где в данном коде ошибка?
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
#include <iostream>
#include <limits>
#include <time.h>
 
const int chislo_strok = 5;
const int chislo_stolbcov = 5;
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    //int chislo_strok, chislo_stolbcov;
    int kolvo_stolbcov;
    int nomer_strochki = 0;
    int pred_podschet = 0;
    int dlina_pocledovatelnosti;
    int k = 1;
 
    short sort_massiv[chislo_strok];
 
    /*cout << "Введите число строк " << endl;
    cin >> chislo_strok;
 
    cout << "Введите число столбцов " << endl;
    cin >> chislo_stolbcov;
 
    int **matriza;
    matriza = new int*[chislo_strok];
 
    for (int i = 0; i < chislo_strok; i++)
        matriza[i] = new int[chislo_stolbcov];
 
    cout << endl;*/
 
    int matriza[chislo_strok][chislo_stolbcov];
 
    for (int i = 0; i < chislo_strok; i++)
    {
        for (int j = 0; j < chislo_stolbcov; j++)
        {
            matriza[i][j] = rand() % 10;
            cout << matriza[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < chislo_strok; i++)
    {
        for (int j = 0; j < chislo_stolbcov - 1; j++)
        {
            dlina_pocledovatelnosti = 0;
            if (matriza[i][j] == matriza[i][j + 1])
            {
                while (matriza[i][j] == matriza[i][j + 1])
                {
                    dlina_pocledovatelnosti++;
                    j++;
                }
            }
 
            if (dlina_pocledovatelnosti > pred_podschet)
            {
                //  nomer_strochki = i;
                pred_podschet = dlina_pocledovatelnosti;
            }
        }
    }
 
    for (int i = 0; i < chislo_strok; i++)
    {
        for (int j = 0; j < chislo_stolbcov - 1; j++)
        {
            if (matriza[i][j] == matriza[i][j + 1])
            {
                while (matriza[i][j] == matriza[i][j + 1])
                {
                    if (dlina_pocledovatelnosti != 0)
                    {
                        nomer_strochki = i;
                        sort_massiv[k] = nomer_strochki;
                        j++;
                    }
                    else
                        j++;
                }
            }
        }
    }
    for (k = 0; k < chislo_strok; k++)
    {
        cout << sort_massiv[k] << " ";
    }
Когда матрицу пробегаю первый раз- считаю самую длинную последовательность. А во время второго пробега- запоминаю номера строк с такой же длинной последовательностью. Записываю их в массив. Но почему-то выводит пять раз - (-13108)
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,536
09.05.2014, 18:27     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов #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
int * nomer_stroki(int **matriza, int chislo_strok, int chislo_stolbcov)
{
    int dlina_pocledovatelnosti;
    int * pred_podschet = new int[chislo_strok];
 
    for (int i = 0; i < chislo_strok; i++)
    {
        pred_podschet[i] = 0;
        for (int j = 0; j < chislo_stolbcov - 1; j++)
        {
            dlina_pocledovatelnosti = 0;
            if (matriza[i][j] == matriza[i][j + 1])
                while (matriza[i][j] == matriza[i][j + 1])
                {
                    dlina_pocledovatelnosti++;
                    j++;
                }
                if (dlina_pocledovatelnosti > pred_podschet[i])
                {
                    pred_podschet[i] = dlina_pocledovatelnosti;
                }
        }
    }
    return pred_podschet;
}
Georguy
0 / 0 / 0
Регистрация: 23.10.2013
Сообщений: 33
09.05.2014, 20:20  [ТС]     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов #5
nmcf, я си++ начал не давно изучать и с указателем на функцию еще не до конца разобрался. Можете написать, пожалуйста еще ее вызов в другой функции да и сам поиск максимального элемента в новом массиве? А то у меня какая-то билиберда получается.
Памирыч
10.05.2014, 03:27     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов
  #6
 Комментарий модератора 
Закрыто. Причина: кросспостинг
Yandex
Объявления
10.05.2014, 03:27     Двумерный массив. Определить номер строки с самой длинной серией одинаковых элементов
Закрытая тема Создать тему
Опции темы

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