Generowanie n-tego słowa z podanych znaków.

0

Hej.

Mam taki problem,

  • dany jest zestaw znaków - "ABCD", z którego powstają dopuszczalne słowa
  • słowa mają ustaloną długość n, dajmy na to n=3.
  • mamy dane słowo początkowe, niech będzie to "ABA".

No i teraz :) Chciałbym wygenerować możliwie najprościej i możliwie najszybciej słowo oddalone od słowa początkowego o m pozycji. Co znaczy oddalone? Słowa powstają tutaj w dosyć naturalnym porządku, tj.

  1. AAA
  2. AAB
  3. AAC
  4. AAD
  5. ABA
  6. ABB
  7. ABC
  8. ABD
  9. ACA
  10. ...

Wg takiego podziału mamy: "ABA" + 3 = "ABD". Nie mam pomysłu jak do tego podejść, bez generowania po drodze niepotrzebnych słów (m może być duże...). Dodatkowo, takie fajerwerki jak next_permutation czy rekurencja odpadają ;) Preferowane jakieś C, ale i pseudokodem koncepcyjnym nie pogardzę :)

0

jednym z podejść będzie traktowanie słowa jako liczby w systemie czwórkowym (A=0, B=1, C=2, D=3). przekształcasz słowo na inta, dodajesz, przekształcasz inta na słowo.
algorytm zamiany systemów liczbowych był wałkowany już miliony razy ;-)

w pierwszą stronę proszę:

int slowotoint(const char *slowo)
{
  int n = strlen(slowo);
  int result = 0;
  int weight = 1;
  for (int i=n-1;i>=0;i--)
  {
     result+=(slowo[i]-'A') * weight;
     weight*=4;
  }
  return result;
}

update: do generowania kolejno słów wystarczyłaby ci funkcja odwrotna do powyższej, z kolejnych liczb całkowitych generujesz po prostu odpowiadające jej słowo.

0

Masz rację. Banalne wręcz rozwiązanie, a ubzdurałem sobie, że nie zadziała :) Wcześniej miałem po prostu dodatkowe założenia, jak zmienna długość słowa, i wtedy rzeczywiscie pojawiał się taki problem, iż "AAA" uznawane było za to samo co "AA" i "A" (zera wiodące). Jednak ze słowami o stałej długości nie ma problemu.

Dzięki za zwrócenie uwagi!

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