Jump to content

Gerar todas combinações possiveis


brolo
 Share

Recommended Posts

Boa Noite a todos,

Quero gerar todas as combinações possiveís dado um array com os elementos, por exemplo:

v=(2,5,6);

Output seria:

2

5

6

25

52

256

526

562

652

Já ando a uns dias a tentar encontrar uma solução para este problema mas não consigo chegar a uma solução:S  :wallbash:

Alguem tem alguma luz ? 

Cumprimentos

Bruno

Link to comment
Share on other sites

Falas em combinações, mas depois tens é permutações...

Qual é que queres?

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

Se bem me lembro tu consegues saber pelo numero de elementos o numero maximo combinações. Porque não as crias a lá pata? tipo uma iteração de zero até ao max combinação?! tens os elementos atravez do resto da divisão inteira pelo numero de elementos.

Link to comment
Share on other sites

Recursividade!

Q: Quais são as combinações possiveis de um array com zero elementos?

A: Fácil! Nenhuma.

Q: Quais são as combinações possíveis de um array com N elementos?

A: Fácil! São as N combinações que começam com cada um dos elementos do array, mais as combinações dos outros N-1 elementos.

agora em código

#include <stdio.h>

void comb(int *arr, size_t n, size_t index) {
    size_t k;
    if (index == n) {
        /* array vazio, imprime o que está "para trás" */
        printf("%d", arr[0]);
        for (k = 1; k < n; k++) printf(" %d", arr[k]);
        puts("");
        return;
    }
    for (k = index; k < n; k++) {
        int tmp;
        /* mete cada um dos elementos ao principio */
        tmp = arr[k];
        arr[k] = arr[index];
        arr[index] = tmp;

        /* recursividade! */
        comb(arr, n, index + 1);

        /* repoe posicao inicial */
        tmp = arr[k];
        arr[k] = arr[index];
        arr[index] = tmp;
    }
}

E podes usar essa função, por exemplo, assim

int main(void) {
    int v[] = {1, 2, 3, 4};
    comb(v, sizeof v / sizeof *v, 0);
    return 0;
}

Deixo ao teu critério a parte de fazeres permutações de N elementos M a M (com M < N), permutações com repetição, ..., ...

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.