Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 55, средняя оценка - 4.95
hokoko
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 13
#1

Все возможные перестановки элементов заданного массива - C++

06.02.2013, 20:52. Просмотров 8267. Ответов 19
Метки нет (Все метки)

Помогите вывести на консоль все возможные перестановки элементов заданного массива
C++
1
void printPermutations (int items [ ], int itemsLength) { ... }
Пример (порядок вывода результатов может отличаться):
C++
1
2
3
4
5
6
7
8
int numbers[ ] = {1, 2, 3};
printPermutations (numbers , 3);
123
132
213
231
312
321
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2013, 20:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Все возможные перестановки элементов заданного массива (C++):

Вывести все возможные перестановки слов в предложении - C++
С клавиатуры пишем предложение. Вывести все возможные перестановки тех слов в этом предложении, что не содержат первых десяти букв...

Все возможные варианты перестановки символов строки - C++
Дана строка s, состоящая из n символ (n меньше 6) составить все возможные варианты перестановки этих символов (язык C)

Все возможные перестановки букв слова - нужен алгоритм - C++
Доброго времени суток, форумчане. Помогите пожалуйста найти/составить алгоритм решения следующей задачи: Дано слово. Найти все возможные...

Рекурсивная функция: все возможные перестановки символов строки - C++
Дана строка с n элементами. Например abs. Надо выводить все возможные варианты например abs asb bas bsa sab sba. Надо...

Все возможные комбнинации элементов массива - C++
Всем привет! Есть массив char array (s - размер массива). Нужно написать прогу, которая выведет все возможные КОМБИНАЦИИ элементов...

Все возможные суммы элементов массива - C++
Нужно сформировать все возможные суммы массива размерностью N Для массива 1 3 5 Результат 4 6 8 9 То есть рассматриваем все возможные...

19
Veselchak
1 / 1 / 0
Регистрация: 06.02.2013
Сообщений: 43
06.02.2013, 22:08 #2
Все возможные перестановки элементов заданного массива, ето количество елементов поднесенное к факториалу.
Тоесть если масив состоит из 5 елементов, то нужен факториал 5. Формула: !5=1*2*3*4*5;
0
abit
264 / 263 / 33
Регистрация: 03.02.2013
Сообщений: 731
06.02.2013, 22:23 #3
Цитата Сообщение от Veselchak Посмотреть сообщение
Все возможные перестановки элементов заданного массива, ето количество елементов поднесенное к факториалу.
Тоесть если масив состоит из 5 елементов, то нужен факториал 5. Формула: !5=1*2*3*4*5;
человек спросил не количество возможных перестановок, а сами перестановки...
по теме - если никто не опередит, сейчас набросаю код, как доделаю по работе один момент

Добавлено через 10 минут
прошу

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
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
 
using namespace std;
 
void printPermutations (int items [], int itemsLength)
{
    vector<int> v;
    for (int i=0; i!=itemsLength; ++i) v.push_back(items[i]); 
 
    while (next_permutation(v.begin(), v.end() ) ) 
    { 
        copy(v.begin(), v.end(), ostream_iterator<int>(cout, ""));
        cout << endl;
    }
}
 
 
int main() 
{ 
    
    const int sizeArray = 3;
    int Array [sizeArray] = {1,2,3};
    
    printPermutations(Array,sizeArray);
    
    return 0;
}
3
hokoko
0 / 0 / 0
Регистрация: 02.02.2013
Сообщений: 13
06.02.2013, 22:33  [ТС] #4
Спасибо
0
Veselchak
1 / 1 / 0
Регистрация: 06.02.2013
Сообщений: 43
06.02.2013, 22:44 #5
Виноват))
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.02.2013, 22:45 #6
Цитата Сообщение от abit Посмотреть сообщение
next_permutation(
Что это за функция такая? Что это за язык? Здесь раздел С++!
Моё решение на С++:
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
#include <stdio.h>
void solve(int items [], int size, int l=0){
    int i;
    if (l==size){
        for (i=0; i<size; i++)
          printf("%d ", items[i]);  
        putchar('\n');
    }
    else
        for (i=l; i<size; i++){
            if (l^i){
                 items[l]^= items[i];
                 items[i]^= items[l];
                 items[l]^= items[i];
                 solve(items, size, l+1);
                 items[l]^= items[i];
                 items[i]^= items[l];
                 items[l]^= items[i];
            }else
                solve(items, size, l+1);
        }
}
int main(int argc, char *argv[]){  
    int arr[]={1, 2, 3, 4};
    solve(arr, 4);
    return 0;
}
ИМХО лучше читаемо
0
abit
264 / 263 / 33
Регистрация: 03.02.2013
Сообщений: 731
06.02.2013, 22:54 #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что это за функция такая? Что это за язык? Здесь раздел С++!
значит, боюсь, вы не совсем знаете язык C++...

можете убедиться это работает - http://liveworkspace.org/code/375xm7$0

про функцию почитайте тут - http://cplusplus.com/reference/algor...xt_permutation

и прекратите изобретать велосипеды, всё уже давно придумано, учите С++, раз знаете, что находитесь в разделе С++
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
06.02.2013, 22:54 #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Что это за функция такая? Что это за язык? Здесь раздел С++!
Моё решение на С++:
Я вас огорчу но Вам в раздел : "Основы С"

Пример выше симпотишный и довольно изящный )
0
palva
2747 / 1848 / 266
Регистрация: 08.06.2007
Сообщений: 7,028
Записей в блоге: 4
06.02.2013, 22:57 #9
Тупой нерекурсивный вариант.
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
#include <iostream>
using namespace std;
int main()
{
    const int n=4;
    int a[n];
    int i,j,k,i1,i2;
    int temp;
    for(i=0; i<n; i++) a[i]=i+1;
    for(;;) {
        for(i=0; i<n; i++) cout << a[i] << " ";
        cout << '\n';
        for(j=n-1; j>0; j--)
            if(a[j]>a[j-1]) break;
        if(j==0) return 0;
        j--;
        for(k=n-1; k>j; k--) {
            if(a[k]>a[j]) {
                temp=a[k];
                a[k]=a[j];
                a[j]=temp;
                break;
            }
        }
        for(i1=j+1,i2=n-1; i1<i2; i1++,i2--) {
            temp=a[i1];
            a[i1]=a[i2];
            a[i2]=temp;
        }
    }
}
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.02.2013, 23:14 #10
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Я вас огорчу но Вам в раздел : "Основы С"
Мой ответ на С++. На Си бы не скомпилировалось. И я ничуть не огорчился бы, даже если это было так.

Цитата Сообщение от abit Посмотреть сообщение
значит, боюсь, вы не совсем знаете язык C++...
Это не значит, что совсем не знаю. Нет, этот пример с использованием <algorithm> ещё что... а вот некоторые вообще всякую экзотику вроде boost используют, словно эта библиотека часть C++!!!
0
abit
06.02.2013, 23:27
  #11

Не по теме:


Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Это не значит, что совсем не знаю. Нет, этот пример с использованием <algorithm> ещё что... а вот некоторые вообще всякую экзотику вроде boost используют, словно эта библиотека часть C++!!!
boost это конечно хорошо, но STL уже давно входит в С++...
я если Вас задел, извините...
дело обстояло так, что я совсем недавно стал учить С++, до этого был fasm, FPC и Haskell, точнее - даже месяца не прошло, как я купил свою первую книжку по С++ и знакомый программист мне посоветовал брать сразу STL и Qt... я залпом и стал читать книги Cкотта Мейерса (ибо очень интересно), поэтому в базовом языке C - я очень слаб (

0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
06.02.2013, 23:36 #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
printf("%d ", items[i]); *
* * * * putchar('\n');
Старый сишный стиль вывода. Я не говорю +/- я говорю что это Си. Любую книгу можете открыть и увидите там это.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
#include <stdio.h>
#include <cstdio> - вот хидер С++
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
int items []
Давайте в рекурсивной функции на стеке копии массивов создавать =)
0
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
06.02.2013, 23:39 #13
разработчики дума 3 вообще не юзали стл и шаблоны. Они ,,изобретали велосипеды,, для конкретных задач.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.02.2013, 23:49 #14
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Давайте в рекурсивной функции на стеке копии массивов создавать =)
не надо тут про копию на стеке. всё по указателю передаётся. Не думаешь же ты, что в стек запихивается неизвестное количество элементов массива неизвестной величины.

Добавлено через 2 минуты
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Старый сишный стиль вывода. Я не говорю +/- я говорю что это Си. Любую книгу можете открыть и увидите там это.
В каком году его признали устаревшим, можно уточнить? Да и не забывай, что язык "Си" вообще, безотносительно ввода/вывода, сейчас повсюду используется и сдавать позиции не намерен.
0
abit
06.02.2013, 23:58     Все возможные перестановки элементов заданного массива
  #15

Не по теме:


Цитата Сообщение от coloc Посмотреть сообщение
разработчики дума 3 вообще не юзали стл и шаблоны. Они ,,изобретали велосипеды,, для конкретных задач.
не уловил связь с doom 3...
дай мне 10 нормальных программистов, 2-3 дизайнеров и 1 сценариста, 5-6 лет, и приличный бюджет, чтобы содержать эту команду, я тебе забацаю аналог дум-3 не то что без STL - а на ассемблере, но когда речь идёт о простых задачах, лучше пользоваться общепринятыми и проверенными инструментами, это быстрее, удобнее и проверенно... всё же вы не разработчик дум-3, чтобы плевать на стандарты

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2013, 23:58
Привет! Вот еще темы с ответами:

Вывести на экран все возможные перестановки введенных ползователем символов - C++
С клавиатуры задается последовательность символов. Написать программу, которая выводит на экран все возможные перестановки введенных...

Вывести на экран все возможные перестановки введенных символов. Где ошибка? - C++
С клавиатуры задается последовательность символов. Написать программу, которая выводит на экран все возможные перестановки введенных...

Рекурсия: вывести все возможные размещения элементов массива - C++
Дан массив char mas = { a, b, c, d, e, f, g, h, j, k }. Вывести на экран все возможные комбинации букв ( каждая комбинация = 10 символов )

Ввести число. Используя рекурсивную функцию, получить все возможные перестановки цифр этого числа - C++
Помогите пожалоста..........Заранеє спасибо


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.02.2013, 23:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru