Algorytm - wyrazy utworzone ze zbiorów liter

0

Witam,

Mam podstawowy problem algorytmiczny i nie mogę sobie z nim zgrabnie poradzić. Mam n-zbiorów k-elementowych:

[j, k, l]
[a, b, c]
[w, x, y, z]

Jak powinien wyglądać optymalnie napisany algorytm, wypisujący wszystkie kombinacje, czyli:

jaw
jax
jay
jaz

jbw
jbx
jby
jbz

jcw
...

kaw
kax
kay
kaz

kbw
...

itd.

Z góry dziękuję za pomoc.

0

Pętla w pętli, w pętli.

php:

$a = (j, k, l);
$b = (a, b, c);
$c = (w, x, y, z);

foreach ($a as $ela){    
    foreach ($b as $elb){        
        foreach ($c as $elc){
            print $ela . $elb . $elc;
        }
    }
}
</php>
0

Witam,

Mało eleganckie rozwiązanie bo co jeśli będzie więcej zbiorów? :) Ale rekurencja załatwiła sprawę (nie wiem czemu dopiero po napisaniu posta wpadłem na to - zmęczenie i pośpiech), więc problem już rozwiązany.

0

Z tego co zrozumiałem zbiorów może być dowolna, nieustalona z góry ilość.

package test;

/**
 *
 * @author piotrek
 */
public class Kombinacje {

    char znaki[][] = {
        {'j', 'k', 'l'},
        {'a', 'b', 'c'},
        {'w', 'x', 'y', 'z'}
    };

    public void wypisz() {
        wypisz(0, "");
    }

    private void wypisz(int poziom, String przedrostek) {
        if (poziom >= znaki.length) {
            System.out.println(przedrostek);
        } else {
            for (char znak : znaki[poziom]) {
                wypisz(poziom + 1, przedrostek + znak);
            }
        }
    }
}
0

Dziękuję za zainteresowanie, dokładnie w ten sam sposób to rozwiązałem.


    private static Collection<String> lettersCombinations() {
        return lettersCombinations(0, new String(), new ArrayList<String>());
    }

    private static Collection<String> lettersCombinations(int n, String prefix, List<String> list) {
        if (_keys.size() > 0) {
            List<Character> chars = _keyMap.get(_keys.get(n));

            for (int i = 0; i < chars.size(); i++) {
                char c = chars.get(i);

                if (n + 1 < _keys.size()) {
                    lettersCombinations(n + 1, prefix + c, list);
                }
                else {
                    list.add(prefix + c);
                }
            }
        }
        
        return list;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1