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

Перестановки: каждая следующая получается из предыдущей перестановкой двух соседних чисел

18.05.2014, 18:47. Показов 4613. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Расскажите пожалуйста как это сделать в СИ#:
Напечатать все перестановки чисел 1....n, чтобы каждая следующая получалась из предыдущей перестановкой двух соседних чисел. Например, при n=3 следует переставлять:
3.21 → 23.1 → 2.13 → 12.3 →1.32 →3.12.
Понимаю логически, но в программе не выходит.
Заранее спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2014, 18:47
Ответы с готовыми решениями:

Сколько имеется четырехзначных чисел, у которых каждая следующая цифра меньше предыдущей? Больше предыдущей?
1. Сколько имеется четырехзначных чисел, у которых каждая следующая цифра меньше предыдущей? Больше предыдущей? если можно то с...

Определить, сколько существует пятизначных чисел, у которых каждая следующая цифра меньше предыдущей?
помогите с решением этой задачки или посоветуйте как подсчитать, а то я уже совсем отчаялся. И это точно не сочетание 10 по 5

Проверить, что каждая следующая цифра трехзначного числа на единицу больше предыдущей
верно ли, что каждая следующая цифра натурального трехзначного числа на единицу больше предыдущей?

19
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.05.2014, 20:28
Кассия, показывайте наработки.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
19.05.2014, 00:18
Лучший ответ Сообщение было отмечено Кассия как решение

Решение

Кассия, похоже на алгоритм генерации перестановок Джонсона - Троттера. Есть реализация с массивчиками:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace TestConsole
{
    class Permutation
    {
        // Размер перестановки
        int n;
 
        /* Индексы
         * idx[i, 0] - содержит элемент i перестановки
         * idx[i, 1] - содержит направление i'го элемента перестановки, как 0 или 1
         *             {0, 1} * 2 - 1 = {-1, 1} - смещение влево/вправо
         *             1 - {0, 1} = {1, 0}      - замена на обратное значение
         */
        int[,] idx;
 
        // Индексы текущего наименьшего мобильного и следующего за ним
        int m, m2;
 
        public Permutation(int N)
        {
            n = N;
            idx = new int[n, 2];
 
            // Заполняем индексы в порядке возрастания
            // Направления направления "вправо" 1> 2> 3>
            while (N-- > 0) { idx[N, 0] = N; idx[N, 1] = 1; }
            InvalidateMobile();
        }
 
        // Поиск индекса наименьшего мобильного элемента
        private void InvalidateMobile()
        {
            m = m2 = -1;
            for (int i = 0; i < n; i++)
            {
                // Проверка на мобильность
                int i2 = i + idx[i, 1] * 2 - 1;
                if (i2 > -1 && i2 < n && idx[i, 0] < idx[i2, 0])
                {
                    // Сравнение по значению
                    if (m == -1 || idx[i, 0] < idx[m, 0])
                    {
                        m = i; m2 = i2;
                    }
                }
            }
 
            LastSwapIndex = m < m2 ? m : m2;
        }
 
        /// <summary>
        /// Вычисление следующей перестановки
        /// </summary>
        public bool Next()
        {
            // Если мобильных элементов нет - завершение алгоритма
            if (m == -1) return false;
 
            // Находим все элементы меньше текущего мобильного и меняем их направление
            for (int i = 0; i < n; i++)
            {
                if (idx[i, 0] < idx[m, 0])
                {
                    idx[i, 1] = 1 - idx[i, 1];
                }
            }
 
            // Меняем местами наименьший мобильный элемент и его соседа
            Swap(ref idx[m, 0], ref idx[m2, 0]);
            Swap(ref idx[m, 1], ref idx[m2, 1]);
 
            InvalidateMobile();
            return true;
        }
 
        /// <summary>
        /// Индекс пары элементов коотрые будет обменяны на следющей итерации
        /// </summary>
        public int LastSwapIndex { get; private set; }
 
        private void Swap(ref int a, ref int b)
        { a = b + 0 * (b = a); }
 
        /// <summary>
        /// Возвращает элеметы массива в порядке перестановки
        /// </summary>
        public IEnumerable<T> Apply<T>(T[] Array)
        {
            for (int i = 0; i < n; i++)
            {
                yield return Array[idx[i, 0]];
            }
        }
 
        public static IEnumerable<Permutation> AllOf(int N)
        {
            Permutation p = new Permutation(N);
            do yield return p;
            while (p.Next());
        }
    }
 
    static class Task
    {
        static void Main()
        {
            int[] A = { 3, 2, 1 };
            List<string> result = new List<string>();
            foreach (var p in Permutation.AllOf(A.Length))
            {
                result.Add(
                    String.Join("", p.Apply(A))
                          .Insert(p.LastSwapIndex + 1, "."));
            }
 
            Console.WriteLine(String.Join(" \u2192 ", result));
            Console.ReadLine();
        }
    }
}
1
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
19.05.2014, 23:11  [ТС]
Спасибо большое! теперь буду разбираться и, если можно, задавать вам вопросы. Я тоже делала через массив, но мне мешает точка, которая должна стоять между меняющимися цифрами. Это я не поняла, как делать, у меня типы данных не сходятся.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
20.05.2014, 00:09
Кассия, не понял - точка нужна или нет? задавайте вопросы, только линкуйте ник в сообщении, чтобы мне пришло уведомление..
1
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
20.05.2014, 23:39  [ТС]
rRczZZ, спасибо! Точка должна быть расположена там, где намечается перестановка. Так должно быть в идеале.
А у меня с типами данных проблема, я раньше писала в Паскале, там таких проблем нет.
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
22.05.2014, 22:09  [ТС]
rRczZZ, вообще довольно сложный алгоритм решения! Я проще представляла...
А зачем нужна проверка на мобильность? что это такое?
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
22.05.2014, 22:22
Кассия, Вы читали описание алгоритма по ссылке или еще где? Вот еще есть описание со стрелками на русском. Смысл такой - ищем наибольший "мобильный" и меняем местами с соседним. Я, в коде выше, разделил поиск индекса наибольшего мобильного и обмена (с дальнейшими действиями) на две функции, чтобы получить место куда вставлять вашу точку. + инвертировал знаки, чтобы подогнать под ваш пример.

Или Вам нужен именно математический вывод алгоритма?
1
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
22.05.2014, 22:43  [ТС]
rRczZZ, Спасибо за ссылки.
Мне нужно,вывести все перестановки чисел 1....n, так чтобы каждая следующая получалась из предыдущей перестановкой двух соседних чисел. И точка показывает, какие числа сейчас поменяются. И все...
Как менять числа местами я знаю, это понятно. Вы их сначала расположили по возрастанию, а потом меняете по значению? В общем смысл ясен, но у меня выводит ошибку в последних строчках, в методе Join. А зачем нужно строки соединять там?
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
22.05.2014, 23:03
Кассия, в моем коде ошибка? в result лежат строки вида "1.23", далее склеиваются со стрелкой. Действительно, не работает в .net 3.5. Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main()
{
    int[] A = { 3, 2, 1 };
    foreach (var p in Permutation.AllOf(A.Length))
    {
        int[] a = p.Apply(A).ToArray();
        for (int i = 0; i < a.Length; i++ )
        {
            Console.Write(a[i]);
            if (i == p.LastSwapIndex) Console.Write(".");
        }
        Console.Write(" ");
    }
 
    Console.ReadLine();
}
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
22.05.2014, 23:18  [ТС]
rRczZZ
О все запустилось. Большое спасибо!!!
Я смысл поняла и как с точкой быть поняла. Теперь буду делать программу, которая не только 3 цифры меняет, а столько сколько введено n.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
22.05.2014, 23:32
Кассия, шикарно. В коде можно менять входной массив как угодно, например, вместо
C#
1
int[] A = { 3, 2, 1 };
писать
C#
1
string[] A = { "Зайцы", "Лисы","Волки","Пони" };
* только поменяйте потом ниже int[] a=.. на var a=
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
24.05.2014, 23:31  [ТС]
rRczZZ, Да, я это поняла. Еще раз большое спасибо, вы мне очень помогли.
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
26.05.2014, 22:47  [ТС]
rRczZZ, И еще один вопрос, пожалуйста. Я делаю так, чтобы массив заполнялся сам, в зависимости от введенной цифры. То есть ввели 4 - перестановка из 1,2,3,4; ввели 6- из1,2,3,4,5,6 и т.д.
Для этого делаю массив вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void Main()
        {
            Console.WriteLine("Введите количество цифр в перестановке");
            int n = Convert.ToInt32(Console.ReadLine());
            int i; int k = 1;
            foreach (var p in Permutation.AllOf(A.Length)) ;
                int [ ]a = new int[n]; //это я создаю массив//
                for (i = 0; i <= n; i++) //здесь он заполняется//
                { a[i] = k;
                k = k + 1;
                }
            for (i = 0; i < n; i++)  //здесь он выходить должен//
            {
                Console.Write(a[i] + " ");
            }
            Console.WriteLine();
            
            int[] a = p.Apply(A).ToArray(); //а здесь он выдает ошибки//
            for (i = 0; i < a.Length; i++)
            {
                Console.Write(a[i]);
                if (i == p.LastSwapIndex) Console.Write(".");
            }
 
            Console.Write(" ");
 
            Console.ReadLine();
        }
Но везде ошибки выводит, почему?
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
27.05.2014, 00:42
Кассия, что-то запутаное там, на копипаст похоже
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
static void Main(string[] args)
{
    Console.WriteLine("Введите количество цифр в перестановке");
    int n = Convert.ToInt32(Console.ReadLine());
            
    // Создайте один раз массив, который будете переставлять
    int[] A = new int[n];
    for (int i = 0; i < n; i++) A[i] = i + 1;
 
    // Перебирайте все перестановки
    foreach (var p in Permutation.AllOf(n))
    {
        // Применяйте каждую к Вашему массиву (получая копию исходного массива с переставленными элементами)
        var a = p.Apply(A).ToArray();
 
        // Выводите на экран
        for (int i = 0; i < n; i++)
        {
            Console.Write(a[i]);
            // Ставя точку в том месте где будет совершен следующий обмен
            if (i == p.LastSwapIndex) Console.Write(".");
        }
        Console.WriteLine();
    }
    Console.ReadLine();
}
1
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
27.05.2014, 21:18  [ТС]
rRczZZ,
Подчеркивает р, (строка 14 и 21) пишет: элемент "р" не существует в текущем контексте.
Что нужно добавить?
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
03.06.2014, 00:14  [ТС]
rRczZZ,
Вот только это осталось исправить, не подскажите в чем ошибка? Что нужно добавить, чтобы он воспринимал р?
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
03.06.2014, 00:17
Кассия, нужен код в котором требуется исправить
1
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
04.06.2014, 00:23  [ТС]
rRczZZ, ошибка в том коде, который вы в последний раз мне писали 27.05.2014.
Переменная р в 11, 14 и 25 строчках

Добавлено через 2 часа 35 минут
rRczZZ, Я уже сама исправила, теперь программа запускается, но какую бы я цифру не ввела, программа не работает. Выводит ошибку - цифра за границей массива.
Почему так может быть?
А куда в какое место программы нужно добавлять ваш код, который вы прислали 27.05 сообщение в теме #15?
И что означает буква р в p.LastSwapIndex, p.Apply(A).ToArray() и других случаях?
0
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 38
05.06.2014, 20:07  [ТС]
rRczZZ, Спасибо Вам, программа уже запускается и все правильно считает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2014, 20:07
Помогаю со студенческими работами здесь

Проверить истинность высказывания: Каждая следующая цифра данного трехзначного натурального числа на единицу больше предыдущей
1. Составить логическое выражение, значение которого равно True, если высказывание истинно, и False, — если ложно.Каждая следующая цифра...

Перестановки: чтобы любые две соседние перестановки отличались только порядком двух соседних элементов
Вводится число n &lt;= 8. Вывести все перестановки чисел 1,2..,n, так, чтобы две любые две соседние перестановки отличались только порядком...

Найти количество двух соседних положительных чисел и двух соседних чисел разного знака
Помогите написать программу. &quot;Ввести натуральное число n и вектор действительных чисел b1,b2...bn. Найти количество двух соседних...

Создать новый файл, каждая строка которого получается из строки исходного файла обратной перестановкой слов
Всем привет!Помогите пожалуйста,на с++ с файлами еще не работал,вот и не понимаю,хоть убейте:D Дан текстовый файл.Создать новый...

Получить массив, первая и вторая строка которой задается формулами, а каждая следующая - сумма двух предыдущих
Всем привет помогите сделать задачу в делфи Получить действительный массив A, первая строка которой задается формулой a1j=2j+3, вторая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru