Код
#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();
}
#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, сравнивает два целых. Вторая сравнивает две строки целых (предполагается, что к моменту вызова они уже отсортированы).
Правда, сейчас она выводит даже те строки, у которых "похожих" нет, но это легко поправить. Перед циклом поиска идентичных строк обнуляем флажок, которые будет ответственным за наличие уже найденных повторных строк. Если нашли повторную строку и флажок опущен, то поднимаем флажок и выводим перед номером найденной строки, номер "базовой строки", то есть той, с которой мы всё сравниваем. Как-то так)