Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
4 / 4 / 0
Регистрация: 29.06.2010
Сообщений: 43

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

11.10.2012, 18:23. Показов 13693. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru