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

[C++] выбор нужных строк из двумерного массива чисел - C++

Восстановить пароль Регистрация
 
Grozaaa90
1 / 1 / 0
Регистрация: 27.05.2010
Сообщений: 15
28.05.2010, 18:12     [C++] выбор нужных строк из двумерного массива чисел #1
Здравствуйте. Есть проблема с решением задачи.
Условие:
1) Есть числа от одного до 15-ти. Нужно сгруппировать эти числа в группы по три. [x y z]
2) Сделать это нужно так, чтобы в одной группе число не повторялось два раза [x y x] - не подходит.
3) Если в предыдущих группах два числа совпадают, то текущая группа также не подходит [x y z] ~ [a x y] - не подходит.
В общем, цель - сгруппировать элементы так, чтобы каждый был в группе с другими пятнадцатью только один раз, то есть сократить число групп до минимума.

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
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
 
int main(void)
{
    using namespace std;
    
    system("cls");
    unsigned short arr[3][3375]; // массив комбинаций
    int farr_count = 0; //количество комбинаций
    
    //всего дано 15 веществ. составить все возможные комбинации из трёх веществ.
    
    int ar;
        for (int i = 0; i < 15; i++)
        {
            for (int j = 0; j < 15; j++)
            {
                for (int k = 0; k < 15; k++)
            {
                farr_count ++;
                //std::cout << " " << farr_count << ")  ";
                    
                //инициализация двумерного массива комбинаций трёх веществ, проходит успешно
                arr[0][ar] = i+1;
                arr[1][ar] = j+1;
                arr[2][ar] = k+1;
                    
                //std::cout << arr[0][ar] << "  "<< arr[1][ar] << "  " <<arr[2][ar] << "\n";
                //cout << "ar:" << ar;
                ar++;
            }
            }
        }
 
    
    cout << "\nPress Enter button\n";
    getchar();
    
    
    unsigned short h[3][3000];
    int p = 0;
    for(ar = 0; ar < farr_count; ar++)
    {
        //cout<< "\n" << arr[0][ar] << "  "<< arr[1][ar] << "  " <<arr[2][ar];
        //исключение строк, в которых содержится два или более одинаковых элемента.
        
        bool wrong = false;
        
        if(arr[0][ar] ==  arr[1][ar] && arr[1][ar]== arr[2][ar])
        {wrong = true;}
        if(arr[0][ar] ==  arr[1][ar] || arr[1][ar]== arr[2][ar] || arr[0][ar] == arr[2][ar])
        {wrong = true;}
        
        
        
        if(wrong == false)
        {
            h[0][p] = arr[0][ar]; 
            h[1][p] = arr[1][ar]; 
            h[2][p] = arr[2][ar];
            //cout << "\n" << h[0][p] << "  "<< h[1][p] << "  " <<h[2][p] ;
            p++;
        }
        //else cout << "\n" << arr[0][ar] << "  "<< arr[1][ar] << "  " <<arr[2][ar] << "     wrong = true";
    }
    
    cout << "\nPress Enter button\n";
    getchar();
 
    unsigned short last[3][300];
    
    for (int i = 0; i <3; i++)
    {
        h[i][0] = i+1;
        last[i][0] = i+1;
    }
    
    int b = 0;
    for(int i = 0; i < p; i++) // окончательная проверка на совпадения в комбинациях 
    {
        bool wrong = false;
        int s;
        for (int c = 0; c < i; c++)
        {   
            s = 0;
            for(int j = 0; j < 3; j++)
            {
            for(int k = 0; k < 3; k++)
            {
                if(h[j][i] == h[k][c])
                {
                s++;
                if(s >= 2) // если два(или более) числа из двух комбинаций совпадают
                {/* cout << "\ts>=2"; */ wrong = true;}//то считаем строку не подходящей
                }
            }
            }
            
        }
        
        
        
        if(wrong == false)//если строка подходит, записываем её в массив
        {
            last[0][p] = h[0][i]; 
            last[1][p] = h[1][i]; 
            last[2][p] = h[2][i];
            cout << "\n" << last[0][b] << "  "<< last[1][b] << "  " <<last[2][b] << "\tgood string";
            b++;
        }
        else cout << "\n" << h[0][i] << "  "<< h[1][i] << "  " <<h[2][i] << "     wrong = true";
             //кроме первого раза, на практике, всё время печатается эта строка 
    }
    
 
    return 0;
}
Буду признателен за помощь. Задача реальная, и простая, но почему-то не выходит.
Компиллировал на MinGW.

Обратите внимание на строки 76-80. Если их убрать, то при выводе в первой строке будут нули. Это тоже для меня загадка.

Добавлено через 14 часов 2 минуты
Помогите, пожалуйста. Действительно важно получить ответ.

Добавлено через 4 часа 49 минут
Поднимаю тему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2010, 18:12     [C++] выбор нужных строк из двумерного массива чисел
Посмотрите здесь:

C++ Для заданного двумерного массива из n строк и m столбцов:
Сортировка двумерного массива по сумме элементов строк C++
C++ Необходимо грамотное отсечение столбцов и строк двумерного массива!
C++ Найти произведение строк двумерного массива
C++ Посчитать количество симметричных строк двумерного массива
Сортировка строк двумерного массива выбором. Не обновляются значения C++
C++ Попарная сортировка строк двумерного массива
C++ Сравнение двумерного массива созданного из двух строк

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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