Код
#include <conio.h>
#include <iostream> //originally "#include <iostream.h>"
#include <stdlib.h>
#include <time.h>
#include <iomanip> //originally "#include <iomanip.h>"

using namespace std;

void generate_matrix(int **a, int n, int m)
{
    srand((unsigned)time(NULL));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            a[i][j] = rand()%10;
}

void print_matrix(int **a, int n, int m)
{
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        cout << setw(4) << a[i][j];
        cout << endl << endl;
    }
}

int compareIntegers(const void* a, const void* b) //сравнение целых для qsort
{
    return (*((int *)a)-*((int *)b));
}

bool isEqualStringsOfIntegers(int *a, int* b, int n) //сравнение массивов целых чисел (которые уже отсортированы)
{
    if(n==0) return true;
    if(*a!=*b) return false;
    return isEqualStringsOfIntegers(a+1,b+1,n-1);
}

void main()
{
    //clrscr(); - borland specific
    int n,m;
    int **a;
    cout << " Vvedite kol-vo strok matritzi: ";
    cin >> n;
    cout << " Vvedite kolichestvo stolbcov matritzi: ";
    cin >> m;
    a = new int *[n];
    for(int i=0;i<n;i++)
    {
        a[i] = new int[m];
    }
    generate_matrix(a,n,m);
    print_matrix(a,n,m);
    //теперь сортируем каждую строку, нам ведь не надо их больше выводить?
    //если же было бы нужно, то можно скопироать на новое место
    for(int i=0;i<n;i++)
    {
        qsort(a[i],m,sizeof(int),compareIntegers);
    }
    bool *marked = new bool[n]; //массив, в котором мы будем отмечать строки, которые уже вошли в какую-либо группу
    for(int i=0;i<n;i++)
    {
        marked[i] = false;
    }
    cout << endl << " Nomera strok, vse elementi kotorix odinakovi: " << endl;
    for(int i=0;i<n-1;i++)
    {
        if(marked[i]) continue;
        cout << i+1 << " ";
        for(int j=i+1;j<n;j++)
        {
            if(isEqualStringsOfIntegers(a[i],a[j],m))
            {
                marked[j] = true;
                cout << j+1 << " ";
            }
        }
        cout << endl;
    }

    for(int i=0;i<n;i++)
    {
        delete[] a[i];
    }
    delete[] a;

    getch();
    
    
}


Ну, как-то так.
1. Адаптировал под Visual Studio (заголовочные файлики смените обратно, если нужно, и clrscr() я оставил закоментированным).
2. Добавил динамическое выделение памяти. А то как-то нехорошо было.
3. Добавил 2 функции: одна для qsort, сравнивает два целых. Вторая сравнивает две строки целых (предполагается, что к моменту вызова они уже отсортированы).

Правда, сейчас она выводит даже те строки, у которых "похожих" нет, но это легко поправить. Перед циклом поиска идентичных строк обнуляем флажок, которые будет ответственным за наличие уже найденных повторных строк. Если нашли повторную строку и флажок опущен, то поднимаем флажок и выводим перед номером найденной строки, номер "базовой строки", то есть той, с которой мы всё сравниваем. Как-то так)