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

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

Войти
Регистрация
Восстановить пароль
 
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Как заполнить такой массив - C++

14.12.2009, 14:58. Просмотров 427. Ответов 4
Метки нет (Все метки)

Есть задача создать и заполнить массив вида

C++
1
int massiv[x][5]
числами от 1 до 13


в каждом элементе массива должно быть 5 цифр от 1 до 13 причем числа не должны повторяться. Нужно перебрать все возможные комбинации

как я посчитал в excel комбинаций должно быть 1287

я решил эту задчу но она очень долго работает я так и не смог дождться когда программа закончит выполняться
можно ли это сделать как то по другому ?

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
int massiv[154430][5]; int i; int i1; int i2; int i3; int i4; int kol;
int n=0;
 
for(i=1; i<14; i++){  /// делаю первичное заполнение массива получаеться 154430 элементов
for(i1=1; i1<14; i1++){
for(i2=1; i2<14; i2++){
for(i3=1; i3<14; i3++){
for(i4=1; i4<14; i4++){
 
if(i!=i1&&i!=i2&&i!=i3&&i!=i4&&i1!=i2&&i1!=i3&&i1!=i4&&i2!=i3&&i2!=i4&&i3!=i4){}
 
massiv[n][0]=i;massiv[n][1]=i1;massiv[n][2]=i2;massiv[n][3]=i3;massiv[n][4]=i4;
n++;
}}}}}
 
 
for(i=0; i<154430; i++){   // удаляю все повторы 154430*154430  получаеться 23848624900 и это очень дождаться завершения думаю не реально
    for(i1=0; i1<154430; i1++){
        if(i!=i1){
 
            if(massiv[i][0]==massiv[i1][0]||massiv[i][0]==massiv[i1][1]||massiv[i][0]==massiv[i1][2]||massiv[i][0]==massiv[i1][3]||massiv[i][0]==massiv[i1][4]){kol++;}
 
            if(massiv[i][1]==massiv[i1][0]||massiv[i][1]==massiv[i1][1]||massiv[i][1]==massiv[i1][2]||massiv[i][1]==massiv[i1][3]||massiv[i][1]==massiv[i1][4]){kol++;}
 
            if(massiv[i][2]==massiv[i1][0]||massiv[i][2]==massiv[i1][1]||massiv[i][2]==massiv[i1][2]||massiv[i][2]==massiv[i1][3]||massiv[i][2]==massiv[i1][4]){kol++;}
 
            if(massiv[i][3]==massiv[i1][0]||massiv[i][3]==massiv[i1][1]||massiv[i][3]==massiv[i1][2]||massiv[i][3]==massiv[i1][3]||massiv[i][3]==massiv[i1][4]){kol++;}
 
            if(massiv[i][4]==massiv[i1][0]||massiv[i][4]==massiv[i1][1]||massiv[i][4]==massiv[i1][2]||massiv[i][4]==massiv[i1][3]||massiv[i][4]==massiv[i1][4]){kol++;}
 
 
            if (kol==5){massiv[i1][0]=0;massiv[i1][1]=0;massiv[i1][2]=0;massiv[i1][3]=0;massiv[i1][4]=0;}
            kol=0;
 
        }}}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2009, 14:58     Как заполнить такой массив
Посмотрите здесь:

Как заполнить массив слов? C++
C++ как заполнить массив
Как заполнить массив! C++
Как инициализировать такой массив C++
C++ Как передать такой массив в функцию
C++ Не пойму как реализовать такой массив=) (формирование массива сумм)
C++ Как равномерно заполнить массив
Как заполнить двумерный динамический массив? C++
Как заполнить массив рандом? C++
C++ Как заполнить двумерный массив?
Как заполнить массив в цикле? C++
Как заполнить массив C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kuroiryuu
312 / 296 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
14.12.2009, 17:04     Как заполнить такой массив #2
а повторов не должно быть по столбцам?
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
14.12.2009, 17:40  [ТС]     Как заполнить такой массив #3
нет по строкам

то есть вариант

2-3-4-5-6 или 3-4-7-8-2 приемлемы

а например

2-3-4-5-2 или 3-4-3-5-6 ошибочны из за повторов
Atrus
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 45
14.12.2009, 18:40     Как заполнить такой массив #4
Делай ч\з рекурсию.
Создаешь функцию которая инкрементит n-й элемент.
В случае если n>13, инкрементит n-1 в случае если n-1>13 инкриментит n-2... и так до конца если 1-й эл-т > 13 - перебор закончен.
kuroiryuu
312 / 296 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
14.12.2009, 19:53     Как заполнить такой массив #5
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
#include<stdio.h>
#include <stdlib.h>
 
bool CheckNum(int **mas,int n, int m, int check, int mas_i, int mas_j)
{
    int count = 0;
    for (int i = 0; i < n; i++)
        if (check == mas[i][mas_j])
            count++;
    for (int j = 0; j < m; j++)
        if (check == mas[mas_i][j])
            count++;
    if (count > 0)
        return true;
    else
        count = 0;
    
    return false;
}
 
int GetRandomNum()
{
    int tmp = 0;
    while(!(tmp >= 1 && tmp <= 13)) 
        tmp = rand();
    return tmp;
}
 
int main(void)
{
    srand(14);
    int** mas;
    int n = 0;
    scanf("%d",&n);
    mas = new int*[n];
    for(int i = 0; i < n; i++)
    {
        mas[i] = new int[5];
        for (int j = 0; j < 5; j++)
            mas[i][j] = 0;
    }
 
    
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < 5; j++)
        {
            bool flag = true;
            while(flag)
            {
                int tmp = GetRandomNum();
                flag = CheckNum(mas,n,5,tmp, i, j);
                if (!flag) mas[i][j] = tmp;
            }
        }
    }
 
    for (int i=0; i < n; ++i) 
    {
        for (int j = 0; j < 5; ++j) 
            printf("%5d ", mas[i][j]);
        printf("\n") ;
    }
    return 0;
}
вроде по условию задания правильно работает...
но здесь идёт проверка на не повторение и в строке и в соответствующем столбце, куда должно добавится число...
по диагоналям не проверял
правда тут один маленький подвох для данного массива: число строк у этого массива должно быть не больше 13.
Yandex
Объявления
14.12.2009, 19:53     Как заполнить такой массив
Ответ Создать тему
Опции темы

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