множества значений

Задание из практики,я не прошу его решать,а прошу помочь и разъяснить его не много.

Дана матрица A состоящая из M строк и Nстолбцов. Элементами матрицы являются натуральные числа. Вывести на экран те пары строк матрицы А, которые состоят из одного и того же множества значений, или сообщение «Нет», если таких пар строк в матрице А нет. Пары строк с номерами x, у и y, х учитывать один раз.

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


Ответы (1 шт):

Автор решения: Harry

Что-то вроде этого:

int M[5][10] =
{
    { 1,2,3,4,5,6,7,8,9,0},
    { 6,2,3,4,5,4,7,8,9,7},
    { 6,2,3,4,0,4,7,1,9,7},
    { 4,2,5,1,9,6,7,8,3,0},
    { 4,2,9,4,0,6,7,1,3,7}
};

int cmp(const void* a, const void* b)
{
    return *(const int*)a - *(const int*)b;
}

int main(int argc, const char * argv[])
{
    int Q[5][10];
    memcpy(Q,M,5*10*sizeof(int));

    for(int i = 0; i < 5; ++i)
        qsort(Q[i],10,sizeof(int),cmp);

    for(int i = 0; i < 5; ++i)
    {
        for(int j = i+1; j < 5; ++j)
        {
            int equ = 1;
            for(int k = 0; k < 10; ++k)
            {
                if (Q[i][k] != Q[j][k])
                {
                    equ = 0;
                    break;
                }
            }
            if (equ) printf("Row %d and %d have equal elements\n",i,j);
        }
    }
}

Update

Чтоб не спорить о том, что имеется в виду под "множеством" - вот второе решение, для истинных множеств...

int M[7][10] =
{
    { 1,2,3,4,5,6,7,8,9,0},
    { 6,2,3,4,5,4,7,8,9,7},
    { 6,2,3,4,0,4,7,1,9,7},
    { 4,2,5,1,9,6,7,8,3,0},
    { 4,2,9,4,0,6,7,1,3,7},
    { 0,0,1,1,1,2,2,2,2,2},
    { 0,0,0,0,2,2,1,1,1,1}
};

int cmp(const void* a, const void* b)
{
    return *(const int*)a - *(const int*)b;
}

int main(int argc, const char * argv[])
{
    int Q[7][11];
    for(int i = 0; i < 7; ++i)
    {
        for(int j = 0; j < 10; ++j)
            Q[i][j+1] = M[i][j];

        qsort(Q[i]+1,10,sizeof(int),cmp);
        int j = 1, r = 1;
        while(++j < 11)
            if (Q[i][r] != Q[i][j] && ++r != j)
                Q[i][r] = Q[i][j];
        Q[i][0] = r;
    }

    for(int i = 0; i < 7; ++i)
    {
        for(int j = i+1; j < 7; ++j)
        {
            if (Q[i][0] != Q[j][0]) continue;
            int equ = 1;
            for(int k = 1; k <= Q[i][0]; ++k)
            {
                if (Q[i][k] != Q[j][k])
                {
                    equ = 0;
                    break;
                }
            }
            if (equ) printf("Row %d and %d have equal elements\n",i,j);
        }
    }
}

Чтоб не преумножать сущности сверх необходимости, в каждой строке матрицы Q первый элемент - количество различных элементов в этой строке, а начиная с элемента 1 идут эти Q[i][0] элементов, которые потом и сравниваются.

→ Ссылка