Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] алгоритм работы с матрицей 
:(
    Опции темы
Determinant
  Дата 6.11.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



По ходу программы пришлось столкнутся с обработкой матрицы...
 необходимо преобразовать матрицу по заданному количеству одинаковых элементов...то есть, например: имеется входящая матрица: 
 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

 заранее спасибо!!!
PM MAIL   Вверх
_Y_
Дата 6.11.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



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

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

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Determinant
Дата 6.11.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Цитата

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


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


Цитата

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


все равно как то запутанно получаеться  smile , может если не трудно, то хотябы код приведите.... smile 
PM MAIL   Вверх
Determinant
  Дата 6.11.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



вот попытался сделать, 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

PM MAIL   Вверх
_Y_
Дата 6.11.2011, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



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

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Determinant
Дата 6.11.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Цитата

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

можно и такой, но жаль, что не С++, мне на нем делать, но попытаюсь перевести если что...
PM MAIL   Вверх
_Y_
Дата 6.11.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Determinant
Дата 6.11.2011, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



Цитата

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


увы нет, не видел...С++ во основном занимаюсь...вот пробовал, пример выслал, что пытался...никак не выходит, я уже несколько недель себе репу чешу как сделать, дальше в курсовой все от этого должно идти...
PM MAIL   Вверх
_Y_
Дата 7.11.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: нет
Всего: 34



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

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Determinant
Дата 8.11.2011, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.11.2011

Репутация: нет
Всего: нет



коллекций нет в С++...но сам С на java очень похож...так что нормально, срочности нет как таковой...так что если не трудно, был бы очень благодарен...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.