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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перестроить матрицу, матрица 
:(
    Опции темы
botasa
Дата 30.9.2012, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть задача : Расположить строки заданной матрицы по возрастанию количества одинаковых элементов в каждой строке. Я ЗНАЮ ЧТО ТУТ ФОРУМ ПО С++, но от C# тут только скобки массива отличаются, а логика таже, и по С++ больше народа читает просто )

матрица 5х5

Есть матрица

1, 1, 5, 3, 8
4, 1, 6, 4, 4
0, 5, 1, 7, 9
8, 1, 3, 1, 1
9, 9, 1, 2, 9

в матрице надо подсчитать количество одинаковых элементов в каждой строке
в данной матрице будет :
2
3
0
3
3

и эту матрице надо так переделать, что б элементы в ней были в таком положении
0
2
3
3
3

то есть вот такого плана:
0, 5, 1, 7, 9
1, 1, 5, 3, 8
4, 1, 6, 4, 4
8, 1, 3, 1, 1
9, 9, 1, 2, 9

Из этого всего я понял, что надо просто отсортировать строки матрицы, но как отсортировать их пользуясь вспомагательным массивом, где записаны их количество повторов цифр непонятно !

Код на C#, и надо на C#, там разница не большая. вот что делал я :
           
Код

 int[] m = new int[5];

            int count1 = 0;
            for (int i = 0; i < 5; i++) {
                count1 = 0;
                for (int j = 1; j < 5; j++) {
                    if (matrix[i, j - 1] == matrix[i, j])
                        count1++;
                }
                m[i] = count1;
            }

Это был подсчет один. элементов в матрице, записал их в массив.
И сама сортировка вот так делал
Код

            for (int i = 0; i < 5; i++)
            {
                for (int j = i; j < 5; j++)
                {
                    if (m[i] > m[j])
                    {

                        int tmp = m[i];
                        m[i] = m[j];
                        m[j] = tmp;

                        int temp = matrix[i, i];
                        matrix[i, i] = matrix[j, j];
                        matrix[j, j] = temp;
                    }
                }
            }


ЧТО тут не правильного, муозги уже закипели 
PM MAIL   Вверх
DarkProg
Дата 30.9.2012, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Цитата(botasa @  30.9.2012,  11:22 Найти цитируемый пост)
Из этого всего я понял, что надо просто отсортировать строки матрицы, но как отсортировать их пользуясь вспомагательным массивом, где записаны их количество повторов цифр непонятно !

Вообще-то очень просто.
Тут реально два вариата:
1) Два массива, в одном исходная матрица, в другом в каждом элементе хранится количество одинаковых символов. Каждый раз когда необходимо обменять два значения местами во втором массиве при сортировке, в первом бёрём и меняем строки(как в линейном массиве, только потребуется третий массив для промежуточного хранения значений)
2) Один массив, просто добавляете ещё один столбец, в котором храните количество одинаковых элементов. Далее сортируете по этому дополнительному столбцу.

Если я правильно понял суть вашего кода, то вы просто не поняли что надо сделать, и основная ошибка, в том что для того чтобы поменять две строки местами потребуется третий массив, в котором будет временно хранится вся строка.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
feodorv
Дата 30.9.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(botasa @  30.9.2012,  11:22 Найти цитируемый пост)
Это был подсчет один. элементов в матрице, записал их в массив.

Увы, подсчёт неверен, так сравниваются два рядом находящихся элемента матрицы:
Цитата(botasa @  30.9.2012,  11:22 Найти цитируемый пост)
                    if (matrix[i, j - 1] == matrix[i, j])

Совпадающие элементы не обязаны располагаться в матрице рядом...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
NoviceF
Дата 30.9.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

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



Цитата(feodorv @ 30.9.2012,  13:27)
Цитата(botasa @  30.9.2012,  11:22 Найти цитируемый пост)
Это был подсчет один. элементов в матрице, записал их в массив.

Увы, подсчёт неверен, так сравниваются два рядом находящихся элемента матрицы:
Цитата(botasa @  30.9.2012,  11:22 Найти цитируемый пост)
                    if (matrix[i, j - 1] == matrix[i, j])

Совпадающие элементы не обязаны располагаться в матрице рядом...

И кроме того, а если в строке одинаковые элементы не одного вида, например 22333?

По-моему условие "по возрастанию количества одинаковых элементов" не конкретизирует этот момент, либо как раз конкретизирует, но автор этого не учитывает.

Вообще по решению, по-моему нужно задавать список лексем из цифр, сравнивать каждую строку со списком лексем, количество совпадений записывать и уже дальше на этом основании сортировать строки матрицы.

Это сообщение отредактировал(а) NoviceF - 30.9.2012, 14:24
PM MAIL   Вверх
math64
Дата 1.10.2012, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нужно каждую строку отсортировать, а это существенно по разному в C++ и С# - если не писать сортировку вручную.
После этого легко находится число одинаковых элементов в строке.
Затем строки сортируются - для этого так же лучше использовать стандартные функции.
PM   Вверх
feodorv
Дата 1.10.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(math64 @  1.10.2012,  08:23 Найти цитируемый пост)
если не писать сортировку вручную

 smile Могу предложить очередной тупой алгоритм:
Код

const int LINE_COUNT = 5;
const int ROW_COUNT = 5;
for( int line = 0; line < LINE_COUNT; line++)
{
  int counts[ROW_COUNT];
  for( int row = 0; row < ROW_COUNT; row++) counts[row] = 0;

  for( int row = 0; row < ROW_COUNT; row++)
     for( int row2 = 0; row2 < ROW_COUNT; row2++)
        if( matrix[line][row] == matrix[line][row2] ) counts[row]++;

  int count = 0;
  for( int row = 0; row < ROW_COUNT; row++) 
    if( counts[row] > count ) count = counts[row];
  if( count == 1 ) count = 0;

  m[line] = count;
}

Дальше нужно будет сортировать строки.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Silent
Дата 1.10.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У вас, botasa, неправильно два с половиной момента:
1) подсчет одинаковых элементов реализован неправильно - считаются только одинаковые стоящие рядом, а надо вообще по строке одинаковые. Реализовывается это в с++ через std::map, в C# вроде как Dictionary;
2) при сортировке вы меняете только диагональные элементы [i,i] и [j,j], а надо менять местами строчки i и j (то бишь все matrix[i,k] и matrix[j,k], k in [0..n-1]).
2+) и еще - количество одинаковых элементов не {2, 3, 0, 3, 3}, а {2, 3, 1, 3, 3} =)

А в целом мыслишь правильно. Держи код (C#):
Код

using System;
using System.Collections.Generic;

namespace Help
{
    class Vingrad
    {
        const int n = 5;
        static int[,] a = new int[5,5]{{1, 1, 5, 3, 8},
                                       {4, 1, 6, 4, 4},
                                       {0, 5, 1, 7, 9},
                                       {8, 1, 3, 1, 1},
                                       {9, 9, 1, 2, 9}};

        static void Main(string[] args)
        {
            int[] m = new int[n];

            //посчитаем количество одинаковых элементов в каждой строке
            for (int i = 0; i < n; i++)
            {
                Dictionary<int, int> c = new Dictionary<int, int>();
                int count = 0;
                for (int j = 0; j < n; j++)
                    if (c.ContainsKey(a[i, j])) c[a[i, j]]++;
                    else c.Add(a[i, j], 1);
                foreach (KeyValuePair<int, int> t in c) m[i] = m[i] > t.Value ? m[i] : t.Value;
            }
            
            //затеем перестановку, метод пузырька, аки botasa
            for (int i = 0; i < n; i++)
                for (int j = i; j < n; j++)
                    if (m[i] > m[j])
                    {
                        int tmp = m[i];
                        m[i] = m[j];
                        m[j] = tmp;

                        for (int k = 0; k < n; k++)
                        {
                            int tmp2 = a[i, k];
                            a[i, k] = a[j, k];
                            a[j, k] = tmp2;
                        }
                    }

            //ну и напечатаем результат трудов наших
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++) Console.Write("{0} ", a[i, j]);
                Console.WriteLine();
            }
        }
    }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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