Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Алгоритм] алгоритм работы с матрицей


Автор: Determinant 6.11.2011, 11:21
По ходу программы пришлось столкнутся с обработкой матрицы...
 необходимо преобразовать матрицу по заданному количеству одинаковых элементов...то есть, например: имеется входящая матрица: 
 1 1 2 2
 0 3 3 0
 4 4 5 5
 0 6 6 0

 в данном случае максимальное количество разных эелементов в матрице 2, именно (1 и 2) в первой строке, (4 и 5) во второй, вопрос теперь в том как сделать что б пользователь вводил максимальное количество одинаковых элементов и данная матрица трансформировалась, например если ввести количество таких элементов равных 1, то данная матрица должна принять вид:
 1 1 0 0
 0 0 2 2
 0 3 3 0
 4 4 0 0
 0 0 5 5
 0 6 6 0

 то есть в каждой строке не более 1 разного элемента...
 вот как такой алгоритм сделать, уже совсем запутался...может кто сталкивался с таким, очень прошу помощи!
 Вот если что кусок кода где я пытался это сделать:

Код

long *N = new long[f];
 for (int i=0; i<e-1; i++){ t=0;
 for (int j=0; j<f-1; j++)
 { N[j]=mat[i][j];
 if (be>kil) o++;
 for (int k=i; k<f; k++)
 {
 if ((mat[i][k]==N[j]) && (k!=j)) Form2->StringGrid1->Cells[o+1][k+1]=IntToStr(N[j]); }
 for (int k=0;k<f-1;k++)
 {
 if (Form2->StringGrid1->Cells[j+1][k+1])=='') Form2->StringGrid1->Cells[j+1][k+1])='0';
 if ((N[j]==StrToInt(Form2->StringGrid1->Cells[j+1][k+1])) && (k!=j)) t++;
 if (t==0) l++;}
 }
 be=l;

 //for (int k=i; k<f; k++){
 //if (be>=kil) t++;
 // if (mat[i][k]==0) {Form2->StringGrid1->Cells[t+1][i+1]=IntToStr(mat[i][j]); }
 // if ((mat[i][j]==mat[i][k]) && (k!=j)) {Form2->StringGrid1->Cells[t+1][i+1]=IntToStr(mat[i][j]); be++; }
 // if ((mat[i][j]!=mat[i][k]) && (k!=j)) {be++; if (be<kil) Form2->StringGrid1->Cells[t+1][i+1]=StrToInt(mat[i][j]); else {Form2->StringGrid1->Cells[j+1][t+1]='0'; t++; continue;}}
 // else if (mat[i][k]!=0) {Form1->StringGrid1->Cells[j+1][i+1]='0'; be++;}

 }

 }


желательно на С++ Builder

 заранее спасибо!!!

Автор: _Y_ 6.11.2011, 11:57
Сначала вопрос - а что должно быть сделано, если, например, пользователь ввел ограничение 2,  а одна из строк выглядит как-то так:
5 5 5 5
т.е. что делать с лишними элентами?

Для приведенного же примера алгоритм довольно прост
1. Создаем новый массив с тем же количеством столбцов и нулем строк.
2. Берем следующую строку матрицы (по порядку начиная с первой)
3. Собираем в отдельный список уникальные элементы
4. Берем следующий по порядку элемент этого уникального списка (начиная с первого элемента)
5. Присоединяем вниз новой матрицы нашу строку.
6. Заменяем в присоединенной строке все элементы не равными элементы неравные взятому в пункте 4 нулями.
7. Если список уникальных элементов не кончился возвращаемся к пункту 4.
8. Если исходная матрица не закончилась возвращаемся к пункту 2.

Теперь осталось вставить кусочек для обработки ответа на мой первый вопрос

Автор: Determinant 6.11.2011, 12:30
Цитата

Сначала вопрос - а что должно быть сделано, если, например, пользователь ввел ограничение 2,  а одна из строк выглядит как-то так:
5 5 5 5
т.е. что делать с лишними элентами?


тогда оставляем данную строку без изменений, так как количество неодинаковых (уникальных) элементов равно 1, что меньше 2...


Цитата

Для приведенного же примера алгоритм довольно прост
1. Создаем новый массив с тем же количеством столбцов и нулем строк.
2. Берем следующую строку матрицы (по порядку начиная с первой)
3. Собираем в отдельный список уникальные элементы
4. Берем следующий по порядку элемент этого уникального списка (начиная с первого элемента)
5. Присоединяем вниз новой матрицы нашу строку.
6. Заменяем в присоединенной строке все элементы не равными элементы неравные взятому в пункте 4 нулями.
7. Если список уникальных элементов не кончился возвращаемся к пункту 4.
8. Если исходная матрица не закончилась возвращаемся к пункту 2.


все равно как то запутанно получаеться  smile , может если не трудно, то хотябы код приведите.... smile 

Автор: Determinant 6.11.2011, 14:53
вот попытался сделать, kil - это та переменная что вводит пользователь, количество тех самых неодинаковых элементов...

Код

long *T=new long[p];    //масив для неодинаковых элементов
for (int i=0; i<p; i++)
  T[i] = i+1;
  int k=0;
  int ip = Form1->StringGrid1->RowCount-1;
  int jp = Form1->StringGrid1->ColCount-1;
for (int k=0; k<p; k++){
if (kaka>kil) o++;
kaka++;
 for (int i=0; i<ip; i++)
  for (int j=0; j<jp; j++)
    if (mat[i][j]==T[k]) {Form2->StringGrid1->Cells[o+1][i+1]=IntToStr(T[k]); o++;} //если елемент матрицы равняеться елементу со списка уникальных елементов то выводим его
      else Form2->StringGrid1->Cells[o+1][i+1]='0'; // если нет, тогда присваиваем ноль
   }


но выводит вот что:

1 1 2 2
      0
      0
      0

вместо:

1 1 0 0
0 0 2 2
0 3 3 0
4 4 0 0
0 0 5 5
0 6 6 0

Автор: _Y_ 6.11.2011, 17:17
Цитата(Determinant @  6.11.2011,  12:30 Найти цитируемый пост)
хотябы код приведите

Несколько странно спрашивать код, не зная на каком языке человек пишет. Код LabVIEW устроит? smile 

Автор: Determinant 6.11.2011, 17:51
Цитата

Несколько странно спрашивать код, не зная на каком языке человек пишет. Код LabVIEW устроит? 

можно и такой, но жаль, что не С++, мне на нем делать, но попытаюсь перевести если что...

Автор: _Y_ 6.11.2011, 22:07
Determinant, вы когда-нибудь LabVIEW код видели?  smile Это язык графического программирования. Гораздо легче написать С++ код с моего описания алгоритма (какой-никакой, а текст), чем садиться учить концептуально другой язык. В нем даже концепции переменной нету  smile .

Автор: Determinant 6.11.2011, 22:22
Цитата

Determinant, вы когда-нибудь LabVIEW код видели?   Это язык графического программирования. Гораздо легче написать С++ код с моего описания алгоритма (какой-никакой, а текст), чем садиться учить концептуально другой язык. В нем даже концепции переменной нету


увы нет, не видел...С++ во основном занимаюсь...вот пробовал, пример выслал, что пытался...никак не выходит, я уже несколько недель себе репу чешу как сделать, дальше в курсовой все от этого должно идти...

Автор: _Y_ 7.11.2011, 10:00
Ну если очень надо, я могу на Java написать (при не очень большом уровне срочности) - на таком-то уровне я его вспомню. С++ мне практически не знаком - никогда не сталкивался с задачами, для которых он бы мне понадобился.

Поэтому вопросы:
Разберетесь с Java?
Коллекции в С++ бывают? А то кажется мне что с массивами возиться долго придется.

Автор: Determinant 8.11.2011, 22:21
коллекций нет в С++...но сам С на java очень похож...так что нормально, срочности нет как таковой...так что если не трудно, был бы очень благодарен...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)