Wygenerowanie nietypowego ciągu liczb

0

Witam!
Mam problem z generowaniem specyficznego ciągu liczb. Otóż chciałbym po podaniu liczby (np. 5) otrzymywać taki ciąg liczb:

11111, 11112, 11122, 11222, 12222, 11123, 11223, 12223, 11233, 12233, 12333, 11234, 12334, 12344, 12345

Mam nadzieję, że się nie pomyliłem i nakreśliłem zależność jaka występuje w tym ciągu.
Próbowałem zrobić to w dwóch FORach (z dodatkowymi zmiennymi "pilnującymi" pozycji cyfry w liczbie) ale nic z tego nie wyszło. Myślałem też, by mając np. podaną liczbę 5 najpierw wygenerować tablicę [1..5] i wszystkie jej permutacje, a później odsiewać sprawdzając czy wygenerowana permutacja jest nie większa niż 12345. Ale oczywiście ten pomysł odpada przy większych liczbach...

Stąd moja prośba - czy można wygenerować tego typu ciąg liczb w jakiś prostszy sposób?
Będę wdzięczny za podpowiedzi, pozdrawiam

0

Na razie wyciągnąłem z tego ciągu tyle:
tablicę tab[1..n]
Pozycja wyjściowa to same jedynki.
tab[i] <= i - czyli tab[1] <= 1 tab[2] <= 2, tab[3] <= 3 itd.
tab[i] <= tab[n] - ostatnia cyfra jest niemniejsza od pozostałych
tab[n - i] = tab[n] - i gdzie 1 <= i <= k, na początku cyklu, gdzie k jest tu numerem cyklu, a za początek cyklu rozumiem zwiększenie ostatniej cyfry

na dalszą analizę niestety zabrakło mi czasu.

0

Dzięki za odpowiedź!
Ja kombinowałem podobnie ale udało mi się jedynie napisać coś takiego

k:=1;
  FOR i := 1 TO 5 DO
  Begin
      FOR j := 1 TO 5 DO
      Begin
        IF k <= i THEN
        Begin
            WriteLn('i: ', k);
            k := k+1
        End
        ELSE
            WriteLn('k: ', i);
      End;
      k:=1;
      WriteLn('********');
  End;

Co wygeneruje nam ciąg:

11111 12222 12333 12344 12345

Próbowałem jakoś to zmodyfikować by działało jak należy jednak nie udało mi się...

0

Wg mnie jest w tym za mało logiki, żeby zrobić to normalnie tylko na samych dwóch pętlach. Ale może się mylę. Powtarzającycm się kodem udało mi się dojść do tego:
11111, 11112, 11122, 11222, 12222, 11123, 11223, 12223, 11233, 12233.
Niestety ta liczba: 12333 już się nijak nie da policzyć. Po co Ci w ogóle coś takiego? Tak z ciekawości pytam.

0

Przekształciłem podane przez Ciebie ciągi do takiej postaci:

11111
11112
11122
11222
12222
11123
11223
12223
11233
12233
12333
11234
12334
12344
12345

ale nijak sensu w nim nie widzę... Ciężko w ogóle zauważyć jakąś stałą zależność między kolejnymi ciągami; Rozwiązanie tego problemu na pewno istnieje, ale niekoniecznie musi algorytm być oparty na dwóch pętlach; Może jest ich więcej, może trzeba zadeklarować jakieś zmienne pomocnicze, nie wiem; Popróbuję jeszcze coś wymyślić, jak coś się uda to napiszę;

Poza tym nie pasuje mi przejście między tymi dwoma ciągami:

12223
11233

Według mnie z 12223 powinno się przejść do 11123;


@ Jednak nie, to przejście w sumie nie wygląda tak źle :-P

Mi to wygląda na jakiś upośledzony Brute Force...


Odnalazłem w nim pewną zależność, jeśli chodzi o ilość wygenerowanych ciągów;

Dla liczby 2 powinieneś mieć 2 ciągi:

11
12

Dla liczby 3 powinieneś mieć 4 ciągi:

111
112
122
123

Dla liczby 4 powinieneś mieć 8 ciagów:

1111
1112
1122
1222
1123
1223
1233
1234

Więc dla liczby 5 powinieneś mieć 16 ciągów, a masz 15 - tak, jakby jednego gdzieś brakowało;

Na ilość ciągów jest fajny wzór - ilość ciągów jest równa liczbie 2 podniesionej do potęgi liczba - 1; Czyli dla 5 to - Ilość = Power(2, 5 - 1);

Nie moge jednak znaleźć brakującego ciągu...


@mati21, brakuje Ci ciągu 12234;

0

Dzięki za odpowiedzi!
w zasadzie nie mam konieczności "ubrania" tego w dwie pętle ale wydawało mi się, że jest to wykonalne.
@Furious Programming, chyba nie zaznaczyłem tego w pierwszym poście i mówiąc o ciągu mogłem wprowadzić w błąd, bo kolejność jest tutaj akurat nieistotna (ważniejsze jest by liczby się nie powtarzały).
@Juhas, odnośnie tego po co mi to, to mam za zadanie znaleźć w drzewie zbudowanym z liczb ścieżkę z największą sumą tych liczb. Możliwe, że jest jakiś prostszy sposób (a nawet na pewno jest jakiś prostszy sposób ;) ale ja wymyśliłem to tak, by to drzewo przechowywać w tablicy dwuwymiarowej. A te ciągi liczb są drugimi współrzędnymi w tej tablicy.

Podam przykład: mam drzewo wyglądające jak poniżej
5
4 2
3 2 5
1 0 4 1
7 2 3 9 1
Dla wygody drzewo "spłaszczam" do lewej strony. Indeksy tablicy wyglądają tak
11
21 22
31 32 33
41 42 43 44
51 52 53 54 55

I aby przejść przez każdą ścieżkę w drzewie muszę umieć wygenerować wszystkie możliwe drugie współrzędne w tablicy, jednocześnie zachowując ciągłość ścieżki. Czyli muszę sprawdzać współrzędne w taki sposób:
11 21 31 41 51, 11 21 31 41 52, 11 21 31 42 52... itd.

0
mati21 napisał(a)

chyba nie zaznaczyłem tego w pierwszym poście i mówiąc o ciągu mogłem wprowadzić w błąd, bo kolejność jest tutaj akurat nieistotna (ważniejsze jest by liczby się nie powtarzały)

Ciąg nie ciąg - jeden pieron; Ale kolejność jest istotna, bo jeśli pomieszasz je to nie będzie można określić w jaki sposób zostały one wygenerowane;

Istnieje sposób na wygenerowanie takich ciągów, nawet wiedziałbym jak to zrobić, ale jest znacznie więcej pisania niż to:

k:=1;
  FOR i := 1 TO 5 DO
  Begin
      FOR j := 1 TO 5 DO
      Begin
        IF k <= i THEN
        Begin
            WriteLn('i: ', k);
            k := k+1
        End
        ELSE
            WriteLn('k: ', i);
      End;
      k:=1;
      WriteLn('********');
  End;

Jak znajdę więcej czasu to może się z tym pomęczę :-P

0

Będę wdzięczny za pomoc :)
Początkowo własnie chciałem to zrobić tak, że część ścieżek generować własnie powyższymi dwiema pętlami, a resztę ścieżek może jeszcze w jakiś inny sposób, z tym, że np. przejście 'zygzakiem' przez drzewo jest już trudniejsze...

0

Ale Tobie chodzi o coś takiego, że mając np. takie drzewo:

Tree.png

chcesz wyznaczyć drogę, gdzie suma cyfr będzie największa:

SolvedTree.png

?

3

Mój algorytm generowania wszystkich ścieżek:

procedure GoDeep(no,depth:integer;s:ansistring);
begin
  if depth=1 then begin writeln(s,no);exit;end;
  GoDeep(no,depth-1,s+inttostr(no));
  GoDeep(no+1,depth-1,s+inttostr(no));
end;

begin
  GoDeep(1,5,'');
  readln;
end.
0

No i po robocie, nie ma to jak rekurencja :-P

Teraz wystarczy sprawdzić wszystkie wygenerowane ścieżki i zapisać ścieżkę wyznaczającą maksymalny wynik;

0

Wow! Dokładnie o coś takiego mi chodziło :) Dzięki serdeczne!
Czyli tak jak mówiłem, że na pewno jest jakiś prostszy sposób...
No, to reszta już pójdzie z górki.
Pozdrawiam :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.