Niedawno czytałem teorię grafów, zwłaszcza hipersześcianów i myślałem o interesujących sposobach budowania na nich ścieżek. Oto, co wymyśliłem.
Jak zapewne wiesz, możesz zbudować n-wymiarową hipersześcię, biorąc wszystkie n-krotki składające się z 1
i 0
jako wierzchołki i łącząc je, jeśli różnią się one jedną cyfrą. Jeśli interpretujesz te cyfry binarne jako liczbę całkowitą, powstaje wykres z ładnie numerowanymi wierzchołkami. Na przykład dla n=3
:
Powiedzmy, że chcesz przejść się po tej hipersześcianie i zacząć od wierzchołka 0
. Jak ustalić, który wierzchołek chcesz odwiedzić w następnej kolejności? Zasada, którą wymyśliłem, to wziąć numer a
wierzchołka, na którym jesteś, odwrócić jego mod(a,n)
bit (indeksowanie od zera) i przejść do wynikowego wierzchołka. Formalnie tę regułę można rekurencyjnie zdefiniować jako
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Przestrzegając tej zasady, zawsze pozostaniesz na sześcianie i będziesz podróżował wzdłuż krawędzi. Powstała ścieżka wygląda następująco
Jak widać, będziesz chodzić w kółko! W rzeczywistości we wszystkich wymiarach i dla wszystkich punktów początkowych twoja ścieżka skończy się w pętli. Na przykład dla n=14
i a[0]=0
wygląda to tak
Dla zapalonego amblera długość jego planowanej trasy jest dość istotną informacją. Twoim zadaniem jest napisanie funkcji lub programu, który przyjmuje wymiar hipersześcianu jako n
wierzchołek początkowy a[0]
jako dane wejściowe i wyprowadza liczbę wierzchołków w wynikowej pętli.
Przypadki testowe
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Zasady
- Standardowe luki są zabronione
- Dane wyjściowe / wejściowe mogą być w dowolnym odpowiednim formacie
- Możesz założyć,
a[0]
że jest poprawnym wierzchołkiem
Punktacja
Najkrótszy kod w bajtach wygrywa.
Jeśli masz dodatkowe informacje na ten temat, z przyjemnością usłyszę!
a[m]
był na hipersześcianie, też a[m+1]
będzie. A ponieważ możesz założyć, a[0]
że jest to prawidłowy wierzchołek, właściwie nie musisz przejmować się żadnymi rzeczami związanymi z hipersześcianami i po prostu przestrzegaj reguły.
a[m+1] = xor(a[m], 2^mod(a[m],n))
, nie ma znaczenia, czy wierzchołki należą do hipersześcianu, prawda?