Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нестандартный способ заполнения матрицы? 
:(
    Опции темы
WaReZMEN
Дата 15.4.2009, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите пожалуйста! Есть у меня массив произвольного размера скажем (10х10) мне необходима за один цикл заполнить его значении от 1 до 5 и дополнительное условия что в этой матрицы должно быть заданное кол-во пустых значений (0) скажем скажем из 4 штуки. Хочется чтоб они были не подряд и каждый раз их было ровно столько сколько я хочу не больше ни меньше. Также дополнительное условие  что эти пустые значения (0) должны быть не в куче а разбросаны по матрице. И еще хотелось бы в этом же цикле определить каких значений больше из набора 1-5.  Конечна достаточно сделать цикл кучу условий и прочего но хочется видеть некое оригинальное решение. ( к примеру захочу я числа не от 1-5 а от 6-10 или вообще диапазон значений будет вводится). Заранее спасибо всем кто поможет. smile 
P.S. Не отправляйте в центр помощи или колледж это не для работы не для учебы а для развития smile
PM MAIL ICQ   Вверх
-Mikle-
Дата 15.4.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Вот так не годится?

Код

        static void Main()
        {
            // входные данные алгоритма
            int cols = 10, rows = 10;
            int minValue = 1, maxValue = 5;
            int maxZeroValues = 4;

        repeat:
            Console.Clear();

            // выходные данные
            int[,] nums = new int[rows, cols];
            Dictionary<int, int> numStat = new Dictionary<int, int>(cols * rows);

            // вспомогательные переменные
            Random rnd = new Random(DateTime.Now.Millisecond);
            int n, zeroCount = 0;

            // начало
            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < cols; c++)
                {
                    // выбираем вероятность около 5% для выпадения "0", порядок следования условий лучше не менять
                    if ((zeroCount < maxZeroValues) && (rnd.NextDouble() < 0.05))
                    {
                        n = 0; zeroCount++;
                    }
                    else
                    {
                        n = rnd.Next(minValue, maxValue + 1); // числа от 1 до 5

                        if (!numStat.ContainsKey(n)) // если стаистика на число не заведена, то 
                            numStat.Add(n, 0);
                        numStat[n]++;
                    }
                    nums[r, c] = n;
                }
            }
            // в случае, если нулей выпало меньше, то
            while (zeroCount < maxZeroValues)
            {
                int r = rnd.Next(rows);
                int c = rnd.Next(cols);
                if (nums[r, c] == 0) continue;
                nums[r, c] = 0;
                zeroCount++;
            }
            // конец

            // выводим результаты
            Console.WriteLine("Состояние матрицы ({0}x{1}):", rows, cols);
            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < cols; c++)
                {
                    Console.Write(nums[r, c] + " ");
                }
                Console.WriteLine();
            }

            Console.WriteLine();
            Console.WriteLine("Состояние статистики:");
            Console.WriteLine("    Нулей в матрице: {0}", zeroCount);
            Console.WriteLine("    Остальных чисел (число->количество):");
            Console.Write("    ");
            foreach (KeyValuePair<int, int> pair in numStat)
                Console.Write("{0}->{1}; ", pair.Key, pair.Value);
            Console.WriteLine();

            Console.WriteLine();
            Console.WriteLine("Нажмите 'R' для перезапуска или лубую другую клавишу для выхода");
            ConsoleKeyInfo cki = Console.ReadKey();
            if (cki.KeyChar == 'r' || cki.KeyChar == 'R')
                goto repeat;
        }



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
WaReZMEN
Дата 15.4.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



-Mikle-, спасибо кое что сгадится а вот зачем масив статискики размером ссому матрицу? и ще плохо это
Код

            // в случае, если нулей выпало меньше, то
            while (zeroCount < maxZeroValues)
            {
                int r = rnd.Next(rows);
                int c = rnd.Next(cols);
                if (nums[r, c] == 0) continue;
                nums[r, c] = 0;
                zeroCount++;
            }

Хочется все в одном цикле smile

Это сообщение отредактировал(а) WaReZMEN - 15.4.2009, 12:45
PM MAIL ICQ   Вверх
-Mikle-
Дата 15.4.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(WaReZMEN @  15.4.2009,  13:46 Найти цитируемый пост)
а вот зачем масив статискики размером ссому матрицу?

Это недоделка, у меня была другая мысль сначала.
замени на 
Код

    Dictionary<int, int> numStat = new Dictionary<int, int>(maxValue + 1 - minValue);

или вообще можно убрать расчет длины
Код

    Dictionary<int, int> numStat = new Dictionary<int, int>();


Цитата(WaReZMEN @  15.4.2009,  13:46 Найти цитируемый пост)
Хочется все в одном цикле 

А чем это не устраивает? Кол-во итераций будет не больше допустимого кол-ва нулей. Я повторю, не больше, чаще будет даже меньше.
Нужно еще подумать тут, что лучше, несколько лишних (а иногда и их отсутствие) итераций с простыми операциями или какой-либо более сложный расчет и более сложное условие выполняющееся (cols*rows) раз...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 15.4.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(-Mikle- @  15.4.2009,  19:17 Найти цитируемый пост)
Нужно еще подумать тут, что лучше, несколько лишних (а иногда и их отсутствие) итераций с простыми операциями или какой-либо более сложный расчет и более сложное условие выполняющееся (cols*rows) раз...

ИмХО, вообще проще было сначала заполнить матрицу числами из заданного диапазона, а потом заменить несколько чисел нулями. К тому же выполнить условие

Цитата(WaReZMEN @  15.4.2009,  07:32 Найти цитируемый пост)
Также дополнительное условие  что эти пустые значения (0) должны быть не в куче а разбросаны по матрице. 


В этом случае будет куда проще.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
-Mikle-
Дата 15.4.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Цитата(diadiavova @  16.4.2009,  00:48 Найти цитируемый пост)
ИмХО, вообще проще было сначала заполнить матрицу числами из заданного диапазона, а потом заменить несколько чисел нулями. К тому же выполнить условие

Я думал об этом, но потом пришел к выводу, что если нулей понадобится не 4, а скажем 40, то общее кол-во итераций будет увеличится полтора раза. Потому и решил, что часть нулей нужно запихнуть уже в первом цикле.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
diadiavova
Дата 15.4.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Но в этом случае контролировать "кучность" намного сложнее, да и в целом алгоритм усложняется. А если учесть, что речь идёт о целочисленных операциях, то вряд ли они систему сильно загрузят. К тому же все эти подсчёты статистики и прочее тоже что-кушают.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
WaReZMEN
Дата 16.4.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



diadiavova, -Mikle-,  спасибо вам огромное!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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