Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
NEW_ID
0 / 0 / 1
Регистрация: 08.01.2015
Сообщений: 61
#1

Найти 3 и более одинаковых рядом стоящих элементов одномерного массива в строках и столбцах - C++

03.06.2015, 12:47. Просмотров 1172. Ответов 25
Метки нет (Все метки)

найти 3 и более одинаковых рядом стоящих элементов одномерного массива в строках и столбцах
http://www.cyberforum.ru/cpp-beginners/thread1344032.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2015, 12:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти 3 и более одинаковых рядом стоящих элементов одномерного массива в строках и столбцах (C++):

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

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

В заданной последовательности чисел найти количество одинаковых рядом стоящих элементов
20. Вводится последовательность из целых чисел. Определить количество...

Сумма элементов матрицы,стоящих в четных столбцах и нечетных строках. На C++.
Помогите,пожалуйста написать программу на C++. написать программу получения...

Поиск одинаковых рядом стоящих элементов
Объявите вектор с элементами целого типа. Заполните его произвольными...

25
dcStep
39 / 39 / 36
Регистрация: 13.04.2015
Сообщений: 83
03.06.2015, 13:42 #2
Цитата Сообщение от NEW_ID Посмотреть сообщение
одномерного массива в строках и столбцах
это как нарисовать красную линию синим маркером.
0
NEW_ID
0 / 0 / 1
Регистрация: 08.01.2015
Сообщений: 61
03.06.2015, 13:45  [ТС] #3
dcStep, ой,двумерном
0
dcStep
39 / 39 / 36
Регистрация: 13.04.2015
Сообщений: 83
03.06.2015, 15:12 #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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int main() {
    int size;
 
    std::cin >> size;
 
    if ( size > 0 ) {
        int** array = new int* [size];
        int* buffer = new int[size];
        int counter;
        bool flag;
 
        srand(time(NULL));
 
        for ( int i = 0; i < size; i++ ) {
            array[i] = new int[size];
            for ( int j = 0; j < size; j++ ) {
                array[i][j] = rand() % 4; //заполняем массив от 0 до 3
                buffer[j] = array[i][j];
                std::cout << array[i][j] << " ";
            }
            std::cout << std::endl;
        }
 
        //ищем последовательность в строках
        for ( int i = 0; i < size; i++ ) {
            flag = false;
            counter = 0;
            for ( int j = 1; j < size; j++ ) {
                buffer[j] = array[i][j];
 
                if ( array[i][j] == array[i][j-1] ) {
                    counter += 1;
                } else {
                    counter = 0;
                }
 
                if ( counter == 2 ) {
                    flag = true;
                }
            }
            buffer[0] = array[i][0];
 
            if ( flag == true ) {
                std::cout << "Horizontal sequence:" << std::endl;
                for ( int j = 0; j < size; j++ ) {
                    std::cout << buffer[j] << " ";
                }
                std::cout << std::endl;
            }
        }
 
        //ищем последовательность в столбцах
        for ( int i = 0; i < size; i++ ) {
            flag = false;
            counter = 0;
            for ( int j = 1; j < size; j++ ) {
                buffer[j] = array[j][i];
 
                if ( array[j][i] == array[j-1][i] ) {
                    counter += 1;
                } else {
                    counter = 0;
                }
 
                if ( counter == 2 ) {
                    flag = true;
                }
            }
            buffer[0] = array[0][i];
 
            if ( flag == true ) {
                std::cout << "Vertical sequence:" << std::endl;
                for ( int j = 0; j < size; j++ ) {
                    std::cout << buffer[j] << std::endl;
                }
            }
        }
 
        for( int i = 0; i < size; i++ ) {
            delete[] array[i];
        }
        delete[] array;
        delete[] buffer;
    } else {
        std::cout << "Wrong size!" << std::endl;
    }
 
    return 0;
}
Код
input:
6

output:
3 2 1 0 2 1 
0 3 2 3 2 1 
3 1 3 1 1 3 
2 3 3 3 1 2 
0 2 0 0 1 2 
0 0 0 2 0 3 
Horizontal sequence:
2 3 3 3 1 2 
Horizontal sequence:
0 0 0 2 0 3 
Vertical sequence:
2
2
1
1
1
0
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
03.06.2015, 15:39 #5
dcStep, а почему бы просто не создать функцию, которая проверяет смежные элементы для ячейки с заданными координатами? И пройтись ей по всему массиву.
0
Bertuw
Заблокирован
03.06.2015, 15:56 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
dcStep, а почему бы просто не создать функцию, которая проверяет смежные элементы для ячейки с заданными координатами? И пройтись ей по всему массиву.
Это уже ты сам будешь фигней страдать, делая море циклов и нечитабельный код "Псевдо -Эксперт ", для всех элементов более >=3 одинаковых.

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
//init
    const int size = 4;
    int init[size][size] = {
        { 1, 2, 4, 4 },
        { 4, 4, 0, 4 },
        { 9, 9, 4, 4 },
        { 9, 9, 9, 8 }
    };
 
    //result
    std::valarray<int> arr(*init, std::pow(size, 2));
    for (int i = 0, count = 1, value; i < 2 * size; i++, count = 1){
        std::valarray<int> result = arr[std::slice((i < size) ? i * size : i - size, size, (i < size) ? 1 : size)];
        value = result[0];
        std::for_each(std::cbegin(result)+1, std::cend(result), [&value, &count](const int& val){
            if (val == value){
                count++;
                if (count == 3)cout <<"Value "<< val<<"     3 >..." << endl;
            }
            else{
                count = 1;
                value = val;
            }
        });
    }
0
dcStep
39 / 39 / 36
Регистрация: 13.04.2015
Сообщений: 83
03.06.2015, 16:23 #7
Цитата Сообщение от Tulosba Посмотреть сообщение
dcStep, а почему бы просто не создать функцию, которая проверяет смежные элементы для ячейки с заданными координатами? И пройтись ей по всему массиву.
тоже вариант, только не представляю реализацию.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
03.06.2015, 16:57 #8
Bertuw, думаешь, выпендрился с кодом, который не соответствует заданию (и Стандарту)?
Вот тебе матрица для проверки:
C++
1
2
3
4
{ 1, 2, 3, 4 },
{ 8, 7, 6, 5 },
{ 9, 0, 2, 3 },
{ 9, 9, 4, 0 }
Как видишь, в левом нижнем углу три девятки. Однако твой код молчит.
Надеюсь, ты также понимаешь, что std::valarray ТС преподу не сдаст, пока не узнает что это такое. И скорее всего он просто до этого ещё не дорос.
0
Bertuw
Заблокирован
03.06.2015, 17:26 #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Bertuw, думаешь, выпендрился с кодом, который не соответствует заданию (и Стандарту)?
Вот тебе матрица для проверки:
Читаем задание:
найти 3 и более одинаковых рядом стоящих элементов одномерного массива в строках и столбцах
Итого, - в строках и столбцах должны стоять минимум 3 одинаковых элемента. Т.е. либо в строке, либо в столбце стоят одинаковые элементы, как минимум 3 и их необходимо вывести. Все соответствует заданию. Считает что я выпендрился воспользовавшись стандартной библиотекой STL . Написал нечто доселе неизвестное "Эксперту С++", который не знает стандартной библиотеки STL , - перл номер 2. Поржал.

2 Везде используется STL (Standard Template Library) простр. имен std:: и он говорит что мой код не соответствует стандарту. Поржал. Перл номер 3 - пришел бы ты в нормальную контору, сказал такое, - тебе бы дальше вопросов не задавали, просто выгнали нафиг и все, как ноль. И, кстати, правильно бы сделали.
Если не будет конкретного ответа, - пусть все считают что очередной "Псевдо-Эксперт" снова врет.

Цитата Сообщение от Tulosba Посмотреть сообщение
Вот тебе матрица для проверки:
Код C++
{ 1, 2, 3, 4 },
{ 8, 7, 6, 5 },
{ 9, 0, 2, 3 },
{ 9, 9, 4, 0 }
Как видишь, в левом нижнем углу три девятки. Однако твой код молчит.
Надеюсь, ты также понимаешь, что std::valarray ТС преподу не сдаст, пока не узнает что это такое. И скорее всего он просто до этого ещё не дорос.
Где там минимум 3 и более одинаковых элементов ? Может ты скажешь, что и по кругу или в столбик должны стоять 3 и более одинаковых элементов и потом скажешь, что мой код неправильно работает? ))
std::valarray - мне абсолютно неинтересно дорос ты до него или препод или ТС.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 17:29 #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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <iterator>
 
using namespace std;
 
const int N = 4;
     const int M = 6;
 
 
int main()
{
setlocale(LC_ALL,"");
    int Arr[N][M] = {
        { 1, 2, 4, 4, 8, 9 },
        { 4, 4, 0, 4, 11, 12 },
        { 9, 9, 4, 4, 11, 13 },
        { 9, 9, 9, 9, 11, 14 }
    };
    set<int> s;
 
 
cout<<"В строках\n";
for (int i=0;i<N;i++){
    for (int j=0;j<M-2;j++){
        if (Arr[i][j]==Arr[i][j+1] && Arr[i][j]==Arr[i][j+2]){
                s.insert(Arr[i][j]);
        }
    }
}
copy(s.begin(),s.end(),ostream_iterator<int>(cout,"\t"));
 
 
cout<<"\nВ столбцах\n";
for (int i=0;i<N-2;i++){
    for (int j=0;j<M;j++){
        if (Arr[i][j]==Arr[i+1][j] && Arr[i][j]==Arr[i+2][j]) s.insert(Arr[i][j]);
    }
}
copy(s.begin(),s.end(),ostream_iterator<int>(cout,"\t"));
 
 
}
0
Croessmah
++Ͻ
14156 / 8081 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
03.06.2015, 17:36 #11
Цитата Сообщение от Bertuw Посмотреть сообщение
Где там минимум 3 и более одинаковых элементов ?
три девятки рядом стоят так-то
В задании сказано
Цитата Сообщение от NEW_ID Посмотреть сообщение
в строках и столбцах
а далее уж как кому покажется
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 17:36 #12
К моему коду поправка.

s.clear();
нужно перед подсчетом в столбцах
0
Bertuw
Заблокирован
03.06.2015, 17:42 #13
daslex, поставь на вход:
C++
1
2
3
4
5
6
int Arr[size][size] = {
        { 1, 2, 4, 4 },
        { 4, 4, 0, 0 },
        { 9, 9, 4, 9 },
        { 9, 9, 0, 8 }
    };
твой код неправильно работает

Добавлено через 43 секунды
Цитата Сообщение от Croessmah Посмотреть сообщение
три девятки рядом стоят так-то
В задании сказано
Где рядом? буквой Г? А может должны еще в столбик и кружок стоять?
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
03.06.2015, 17:46 #14
В чем же неправильно. Поставь, поменяй размеры в const,
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 <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <iterator>
 
using namespace std;
 
const int N = 4;
     const int M = 4;
 
 
int main()
{
setlocale(LC_ALL,"");
    int Arr[N][M] = {
        { 1, 2, 4, 4 },
        { 4, 4, 0, 0 },
        { 9, 9, 4, 9 },
        { 9, 9, 0, 8 }
    };
    set<int> s;
 
 
cout<<"В строках\n";
for (int i=0;i<N;i++){
    for (int j=0;j<M-2;j++){
        if (Arr[i][j]==Arr[i][j+1] && Arr[i][j]==Arr[i][j+2]){
                s.insert(Arr[i][j]);
        }
    }
}
copy(s.begin(),s.end(),ostream_iterator<int>(cout,"\t"));
 
s.clear();
 
cout<<"\nВ столбцах\n";
for (int i=0;i<N-2;i++){
    for (int j=0;j<M;j++){
        if (Arr[i][j]==Arr[i+1][j] && Arr[i][j]==Arr[i+2][j]) s.insert(Arr[i][j]);
    }
}
copy(s.begin(),s.end(),ostream_iterator<int>(cout,"\t"));
 
 
}
трех подряд нет, ничего и не выводится

Добавлено через 2 минуты
Понял что не так
Ок, неправильно
0
Croessmah
++Ͻ
14156 / 8081 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
03.06.2015, 17:50 #15
Цитата Сообщение от Bertuw Посмотреть сообщение
Где рядом? буквой Г?
а что, не рядом?
Цитата Сообщение от Bertuw Посмотреть сообщение
Везде используется STL (Standard Template Library) простр. имен std:: и он говорит что мой код не соответствует стандарту
В стандарте нет std::cbeing, только std::begin
0
Bertuw
Заблокирован
03.06.2015, 17:53 #16
Цитата Сообщение от Croessmah Посмотреть сообщение
В стандарте нет std::cbegin, только std::begin
Еще один (или один и тот же), всевдо эксперт не знает С++
http://en.cppreference.com/w/cpp/iterator/begin
1
Croessmah
++Ͻ
14156 / 8081 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
03.06.2015, 17:54 #17
Bertuw, в черновике от 10.04.2015 не нашел.
А, всё, нашел. Сор.
0
Bertuw
Заблокирован
03.06.2015, 17:57 #18
Цитата Сообщение от Croessmah Посмотреть сообщение
а что, не рядом?
Вроде бы кроме тебя, все поняли иначе. А именно в строках и столбцах, например daslex, dcStep. Может то, что нужно на самом деле знал лишь автор, который НЕ умеет писать грамотно задание, заходя под разными никами , если 3 человека поняли неправильно?
0
Croessmah
++Ͻ
14156 / 8081 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
03.06.2015, 17:59 #19
Цитата Сообщение от Bertuw Посмотреть сообщение
ожет то, что нужно на самом деле знал лишь автор, который НЕ умеет писать грамотно задание
а такое сплошь и рядом, так что ничего удивительного. Я вот одного препода знаю, так он составляет задания так, что его можно понять по разному и без взятки не сдашь
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
03.06.2015, 19:16 #20

Не по теме:

Bertuw, похоже, у тебя нехилый батхёрт из-за надписи "Эксперт" Хочешь себе такую же? - Оставь заявку.


Задание ТС в исходной постановке вообще абсурдно, о чем было выяснено в первых трёх сообщениях ветки.
С учетом замечаний, я понял его именно как поиск одинаковых смежных элементов.
Решение "в лоб", о котором я говорил:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
template<int N>
int sameCount(int (&a)[N][N], int r, int c)
{
    int count = 0;
    for(int i=r-1; i<=r+1; ++i )
    {
        if( i>=0 && i<N )
        {
            for( int j=c-1; j<=c+1; ++j )
            {
                if( j>=0 && j<N )
                {
                    count += (a[r][c] == a[i][j]);     
                }
            }
        }
    }
    return count;
}
 
int main() {
    
    const int size = 4;
    int init[size][size] = {
        { 1, 2, 3, 4 },
        { 8, 7, 6, 5 },
        { 9, 0, 2, 3 },
        { 9, 9, 1, 0 }
    };
 
    for( int i=0; i<size; ++i )
    {
        for( int j=0; j<size; ++j )
        {
            if( sameCount(init, i, j) >= 3 )
            {
                std::cout << i << ":" << j << "=" << init[i][j] << std::endl;
            }
        }
    }
    
    return 0;
}

Заметь, Bertuw, такой код скорее будет понятен ТСу, чем твой.
Если для тебя это по-прежнему не показатель, то посмотри ещё раз на название ветки форума, куда пишешь.

На счет std::cend. Он есть, но в Стандарте нет его упоминания его реализации для std::valarray, в отличии от неконстантной версии.

Код с std::cend для std::valarray я смог собрать только в VS, который, как тебе должно быть известно, не очень-то славится строгим следованием Стандарту.
0
03.06.2015, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 19:16
Привет! Вот еще темы с решениями:

Найти и вывести все имеющиеся пары стоящих рядом одинаковых символов
Помогите решить пожалуйста: Среди данного массива символов, найти и вывести...

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

Найти сумму элементов, стоящих в четных столбцах, в каждой строке
Заполнить двумерный массив N x N случайными числами из интервала и найти сумму...

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


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

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

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