LINUX.ORG.RU

все возможные вариации из слова

 ,


0

4

пишу игрушку для себя, кипит мозга, нифига не получается, ребят выручите с кодом

нужна обработка всех вариаций значений массива

имеется массив char m = {'М','И','Р'}; даёт вариации: МИР МРИ РИМ РМИ ИМР ИРМ

char m = {'М','И','Р','А'}; даст вариации: МИРА МИАР МАРИ МАИР МРИА МРАИ РИМА ...

длина слова разная, повторов и пропусков быть не должно (т.е. для последнего МИРР | МРИ не верно)

ANSIC

очень благодарен, за любой пинок в нужном направлении.



Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от anonymous
#include<stdio.h>
#include<string.h>
#include<stdbool.h>

int next_permutation(char *p) {
  int a,b;
  for (a = strlen(p) - 2; a >= 0; --a)
    if (p[a] < p[a + 1])
      for (b = strlen(p) - 1;; --b)
        if (p[b] > p[a]) {
          int t = p[a];
          p[a] = p[b];
          p[b] = t;
          for (++a, b = strlen(p) - 1; a < b; ++a, --b) {
            t = p[a];
            p[a] = p[b];
            p[b] = t;
          }
          return true;
        }
  return false;
}



int main() {
    char p[] = {'M','U','P','\0'};

    while (next_permutation(p))
        printf("%s\n",p);

    return 0;
}

даёт только PMU PUM UMP UPM :(

sadavod
() автор топика
#include <algorithm>
#include <iostream>
#include <ostream>
#include <string>
using namespace std;

void print_all_permutations(const string& s)
{
    string s1 = s;
    sort(s1.begin(), s1.end()); 
    do {
        cout << s1 << endl;
    } while (next_permutation(s1.begin(), s1.end()));
}

int main()
{
    print_all_permutations("MUP");
}
MPU
MUP
PMU
PUM
UMP
UPM
ymn ★★★★★
()
Ответ на: комментарий от encyrtid

Ой, да ладно, ведь так похоже.

anonymous
()
Ответ на: комментарий от sadavod

Так перепиши - там практически C, только вместо указателей итераторы.

unsigned ★★★★
()
Ответ на: комментарий от encyrtid

И какая у этого будет сложность? Если xs\\[x] выполняется за O(длина xs), то это вроде бы будет квадрат факториала вместо факториала.

Yareg ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.