Ich habe das als Graphenproblem aufgefasst. Also Ladebuchse, jeder Adapter, und das zu ladenende Gerät sind Knoten. Alle Knoten deren Wert nicht mehr als 3 voneinander entfernt sind haben eine Kante/Verbindung vom kleineren Wert zum grösseren. Hier mal das kleine Beispiel aus der Aufgabe:
Code: Alles auswählen
+----+
| 0 |
+----+
|
v
+----+
| 1 |
+----+
|
v
+----+
+- | 4 | -+
| +----+ |
| | |
| v |
| +----+ |
| | 5 | -+----+
| +----+ | |
| | | |
| v | |
| +----+ | |
| | 6 | <+ |
| +----+ |
| | |
| v |
| +----+ |
+> | 7 | <-----+
+----+
|
v
+----+
| 10 | -+
+----+ |
| |
v |
+----+ |
| 11 | |
+----+ |
| |
v |
+----+ |
| 12 | <+
+----+
|
v
+----+
| 15 |
+----+
|
v
+----+
| 16 |
+----+
|
v
+----+
| 19 |
+----+
Frage ist jetzt wie viele Wege es von der Ladebuchse zum Gerät bzw. letzten Adapter gibt. Das könnte man rekursiv von der Ladebuchse aus machen, aber wenn man sich mal anschaut wie das abläuft, sieht man, dass man das recht effizient vom Gerät aus lösen kann in dem man linear von hinten durch die Adapter geht und die Anzahl der Wege die vom aktuellen Adapter zum Ziel führen einfach auf die Anzahl der Wege aller direkten Vorgänger addiert.
Hier die Lösung in BASIC für den C64:
Code: Alles auswählen
10 TI$="000000":OM=1000000:DIM A(100),H(3),J(100,2):N=0
20 PRINT"READING ADAPTER JOLTS...":OPEN 2,8,2,"INPUT10,S,R"
30 IF ST<>0 THEN CLOSE 2:PRINT"READING TIME: "TI$:GOTO 100
40 INPUT#2,A(N):PRINT N:PRINT"{UP}";:N=N+1:GOTO 30
100 PRINT"SORTING ADAPTERS..."
110 F=0:FOR I=1 TO N:IF A(I-1)<A(I) THEN F=-1:T=A(I):A(I)=A(I-1):A(I-1)=T
120 NEXT:IF F THEN 110
130 REM CALCULATE DIFFERENCE HISTOGRAM
140 FOR I=1 TO N:D=A(I-1)-A(I):H(D)=H(D)+1:NEXT
150 PRINT"PART 1:";H(1)*(H(3)+1):PRINT"TIME SO FAR: "TI$
200 REM CALCULATE TOTAL JOLTAGE
210 J(0,0)=1:FOR I=0 TO N:FOR J=I+1 TO I+3:IF J>N THEN 250
220 IF A(I)-A(J)>3 THEN 250
230 L=J(I,0)+J(J,0):H=J(I,1)+J(J,1):IF L>OM THEN L=L-OM:H=H+1
240 J(J,0)=L:J(J,1)=H
250 NEXT:NEXT:PRINT"PART 2:"J(N,1)"MIO. +"J(N,0):PRINT"TOTAL TIME: "TI$
Es hat mal wieder die Genauigkeit der Gleitkommazahlen vom C64 nicht gereicht, weshalb ich die Summe auf zwei Werte aufgeteilt habe: einer zählt die ganzen Millionen und der andere den Rest. Darum wird das Ergebnis 14.173.478.093.824 als ``14173478 MIO. + 93824`` ausgegeben.
