4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43

Все варианты перестановок символов в строке с повторениями

11.10.2012, 18:23. Показов 13780. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно получить все варианты перестановок символов в строке "0123" с повторениями символов. Пока что имею вот такой код, но он находит перестановки без повторений(
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string word = "0123";
            List<string> shuffled = new List<string>();
            char[] wordArray = word.ToCharArray();
            char ch;
            for (int i = 0; i < word.Length; i++)
            {
                for (int j = 0; j < word.Length - 1; j++)
                {
                    ch = wordArray[j];                    
                    wordArray[j] = wordArray[j + 1];
                    wordArray[j + 1] = ch;
                    temp = "";
                    foreach (char tempw in wordArray)
                    {
                        temp += tempw;
                    }
                    shuffled.Add(temp.ToString());
                }
            }
P.S. параллельно модернизируя имеющийся код: хочу заменить цикл foreach на string.concat(wordArray), а мне в массив shiffled тогда заносится System.char[] вместо нужной строки(( В чем дело?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2012, 18:23
Ответы с готовыми решениями:

Все варианты перестановок
Пользователь вводит символы. Необходимо вывести получившиеся слова длиной 2

Вывести все возможные варианты перестановок от 1 до n
Здравствуйте, у меня есть массив чисел от 1 до n, нужно чтобы выводились все возможные варианты перестановок по порядку, то есть для трёх...

Найти все неповторяющиеся варианты перестановок элементов массива
Здравствуйте. Нужно написать процедуру Next, при этом дан массив V, а нужно найти все неповторяющиеся варианты перестановок элементов...

10
 Аватар для mbigun
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
12.10.2012, 17:44
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       static void Main(string[] args)
        {
            foreach (var s in GetPermutations("0123").ToArray())
            {
                Console.WriteLine(s);            
            }
            Console.ReadKey();
        }
 
        public static IEnumerable<string> GetPermutations(string s)
        { 
            if (s.Length > 1)
                return from ch in s from permutation in GetPermutations(s.Remove(s.IndexOf(ch), 1)) 
                       select string.Format("{0}{1}", ch, permutation); 
            else         
                return new string[] { s };
        }
Так?
0
4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43
12.10.2012, 17:49  [ТС]
Ругается, во что говорит:
Ошибка 1 "System.Collections.Generic.IEnumerable< string>" не содержит определения для "ToArray" и не был найден метод расширения "ToArray", принимающий тип "System.Collections.Generic.IEnumerable< string>" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
Ошибка 2 Не удается найти реализацию шаблона запроса для типа источника "string". "SelectMany" не найден. Возможно, не хватает ссылки на "System.Core.dll" или директивы using для "System.Linq".
0
 Аватар для mbigun
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
12.10.2012, 17:53
подключите
C#
1
using System.Linq;
0
4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43
12.10.2012, 17:57  [ТС]
Теперь так: Имя типа или пространства имен "Linq" отсутствует в пространстве имен "System" (пропущена ссылка на сборку?)
0
 Аватар для mbigun
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
12.10.2012, 18:10
Под какой версией фреймворк ты компилируешь приложение?
Вызови контестное меню на проекте(в обозревателе решений) -> выбери пункт Свойства (если ты используешь Visual Studio)
Измени на более позднюю версию 3 - 3.5 например
1
4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43
12.10.2012, 18:20  [ТС]
Заменил на 3.5, заработало, спасибо) Но немного не так - тут нет повторений((
Но это не все(( Еще надо все варианты перестановок состоящих из n символов при размере алфавита m т.е.
для 0123 нужно получить все варианты перестановок состоящих из, например, 3 символов:
000
001
002
003
010
011
012
...
333
0
 Аватар для mbigun
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
12.10.2012, 18:42
По поводу повторений я так и не понял.
По поводу всех переборок состоящих из 3 символов так можно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
       static void Main(string[] args)
        {
            foreach (var s in Combinations(3, '0', '3')) 
            { 
                Console.WriteLine(s); 
            } 
            Console.ReadKey();
        }
 
        public static IEnumerable<char[]> Combinations(int length, char startChar, char endChar)
        {
            int numChars = endChar - startChar + 1;
            var s = new String(startChar, length).ToCharArray();
            for (int it = 1; it <= Math.Pow(numChars, length); ++it)
            {
                yield return s;
                for (int ix = 0; ix < s.Length; ++ix)
                    if (ix == 0 || it % Math.Pow(numChars, ix) == 0)
                        s[s.Length - 1 - ix] = (char)(startChar + (s[s.Length - 1 - ix] - startChar + 1) % numChars);
            }
        }
1
4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43
12.10.2012, 18:57  [ТС]
Повторятся должны символы т.е. если без повторений, то вариант, например, 000 будет отсутствовать, потому что 0 повторяется)) А мне нужно именно так как работает последний вариант кода)) Спасибо) Теперь буду разбираться как это работает) А можно комменты к коду?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
12.10.2012, 19:19
bit_x64, вот нечто, что должно работать. https://www.cyberforum.ru/post550619.html
Надеюсь разберетесь.

Добавлено через 2 минуты
Вот, что я писал некогда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char s[N+1], t; int i, j, r, k;
 for(i=0; i<N; i++) s[i] = 'A'+i;
 s[N] = '\0';
 while(1) {
   printf("%s\n", s);  // Вывод очередной перестановки
       // Находим самое правое место, где s[i] < s[i+1]
   for(i=N-1; i>=0 && s[i] > s[i+1]; i--) ;
   if (i<0) break; // Уже получили "654321" - самую старшую перестановку
       // Находим s[j] - наименьший элемент справа от s[i] и больший его
   for(j=N-1; s[i] > s[j]; j--) ;
       // Меняем s[i] <-> s[j]
   t = s[j];
   s[j] = s[i];
   s[i] = t;
       // То, что за "i" - переворачиваем
   for(k=i+1, r=N-1; r > k; k++, r--) {
     t = s[r];
     s[r] = s[k];
     s[k] = t;
   }
 }
на шарпе будет нечто такое же, т.к. std::next_permutation я не использовал
0
 Аватар для mbigun
136 / 136 / 46
Регистрация: 21.04.2009
Сообщений: 178
12.10.2012, 20:15
Цитата Сообщение от bit_x64 Посмотреть сообщение
А можно комменты к коду?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static IEnumerable<char[]> Combinations(int length, char startChar, char endChar)
        {
            // Определим общее количество символов, которое будет учавствовать в переборе '0'+'1'+'2'+'3' = 4 символа 
            int numChars = endChar - startChar + 1;  //На самом деле здесь 51-48+1, так как символ '3' имеет порядковый номер 51, а символ '0' - 48 
            // Определим набор первых символов. перменная s содержит массив из трех нулей  '0' '0' '0' - это наш первый вариант перебора
            var s = new String(startChar, length).ToCharArray();
            //Определяем общее количество возможных переборок. Math.Pow(numChars, length) = 4^3(4 в степени 3) = 64 варианта. 
            //Начинаем цикл со второго варианта, так как первый - это 3 нуля(мы их уже определили)
            for (int it = 1; it <= Math.Pow(numChars, length); ++it)
            {
                //Возвратим первый вариант - 3 нуля (ключевое слово yield позволит тебе возвратить результат и дальше продолжить цикл с этого места)
                yield return s;
                //Изменим наш массив символов.
                //С первого по последний символ в массиве запускаем цикл.                
                for (int ix = 0; ix < s.Length; ++ix) 
                   //Если символ первый либо последующий в зависимости от номера текущей переборки it 
                    if (ix == 0 || it % Math.Pow(numChars, ix) == 0)
                        //Меняем символ от последнего к первому (char)(....) - по порядковому номеру символа мы получим сам символ :)
                        s[s.Length - 1 - ix] = (char)(startChar + (s[s.Length - 1 - ix] - startChar + 1) % numChars);
            }
        }
Лучше всего пошагово пройдись в компиляторе по этому коду и посмотри как идет переприсвоение символов. Очень интересно как влияет ключевое слово yield. Код не мой , украл с друго-го форума. Метод работает с порядковыми номерами символов, соответственно можно посмотреть результат перебора, скажем, от 'А' до 'Г' и взять длинну перебора 4 к примеру.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2012, 20:15
Помогаю со студенческими работами здесь

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

Дано слово. Вывести все варианты перестановок его букв
Помогите решить задачу. ни как не смог сам. Дано слово. Вывести все варианты перестановок его букв. Например для Дом Будет: Дом ...

Все варианты перестановок элементов массива через рекурсивную функцию
Здравствуйте. Задача вывести все варианты перестановок элементов массива. Как это сделать? Если можно, объясните.

Перечисление перестановок с повторениями
Помогите исправить ошибку. У меня проблема в том, что повторяются комбинации несколько раз. Вот сама программа: Sub ыыфа() Dim A(10,...

Составить все варианты подстрок символов из строки, состоящей не более чем из 3 символов
Народ, здравствуйте! Ума ни приложу как решать эту задачу. Помогите, пожалуйста! Заранее благодарен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru