Türme von Hanoi

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Revyn
User
Beiträge: 2
Registriert: Donnerstag 9. Juni 2016, 18:02

Liebe Foren-Miglieder,
ich stehe gerade vor einer für mich unlösbaren Aufgabe.
Das nachfolgende Programm soll (bzw. es macht es auch) belieb viele Scheiben vom Startturm zum Zielturm unter Verwendung eines Hilfsturmes (also ingesamt 3 Türme) transportieren. Das klappt auch alles gut.

[codebox=python file=Unbenannt.txt]def hanoi(n, start, hilfsplatz, ziel):

print (start, hilfsplatz, ziel)
print(start[0],"start0")
if n > 0:

hanoi(n - 1, start, ziel, hilfsplatz)
if start[0]:
disk = start[0].pop()
print ("moving " + str(disk) + " from " + start[1] + " to " + ziel[1])
ziel[0].append(disk)
hanoi(n - 1, hilfsplatz, start, ziel)

def anlegen_source(n):
start=[]
for i in range(1,n+1,1):
start.append(i)
start.reverse()
return start

def main():
anz=int(input("Wie viele Zahlen?"))
start = (anlegen_source(anz), "start")
ziel = ([], "ziel")
hilfsplatz = ([], "hilfsplatz")
hanoi(anz, start, hilfsplatz, ziel)
print (start, hilfsplatz, ziel)


main()
[/code]

Nun wollte ich gerne ein Programm schreiben welches 4 Türme (also 2 Hilfstürme) benutzt. Ich habe auch schon eine Variante, welche funktioniert. Ich möchte diese aber gerne auf das selbe Verhalten (also mittels Array) bringen wie das obere Programm. Vielleicht kann mir da jemand helfen.
[codebox=python file=Unbenannt.txt]import math
def hanoi_4towers(n,start,ziel,hilfsplatz1,hilfsplatz2):
if(n>1):
k=int(-0.5+math.sqrt(0.25+2*n))
hanoi_4towers(n-k,start,hilfsplatz1,ziel,hilfsplatz2)
hanoi_3towers(n-k+1,n,start,ziel,hilfsplatz2)
hanoi_4towers(n-k,hilfsplatz1,ziel,start,hilfsplatz2)
else:
print("Setze Scheibe",n,"von",start,"nach",ziel)

def hanoi_3towers(n1,n2,start,ziel,hilfsplatz):
if(n2-n1>0):
hanoi_3towers(n1, n2 - 1, start, hilfsplatz, ziel)
print("Setze Scheibe",n2,"von",start,"nach",ziel)
hanoi_3towers(n1,n2-1,hilfsplatz,ziel,start)
else:
print("Setze Scheibe", n2, "von", start, "nach", ziel)

[/code]

Bitte helft mir! Danke schonmal!
BlackJack

@Revyn: Ist das erste Programm aus der Vorlesung/dem Unterricht, war das mit vier Türmen die Hausaufgabe, und ist das zweite Programm irgendwo aus dem Netz und Du suchst jetzt jemanden der Deine Hausaufgaben macht? :wink:

Wo liegt denn das Problem? Was hast Du versucht? Was hast Du erwartet was dabei passiert? Was ist stattdessen passiert?

Edit: Wobei das erste Programm keine Arrays verwendet. Und die Plätze in Tupeln zu speichern nicht wirklich schön lesbar ist. Man hätte da zumindest `collections.namedtuple` für verwenden können um die nichtssagenden Indexzugriffe loszuwerden. Das erstellen der Startliste ist äusserst umständlich gelöst. Es gibt `reversed()` und `list()`: ``return list(reversed(range(1, n + 1)))``.
Revyn
User
Beiträge: 2
Registriert: Donnerstag 9. Juni 2016, 18:02

Nein das erste Programm ist nicht aus der Vorlesung.

Ich wollte halt einfach gerne, dass beim zweiten Programm auch eine Eingabe von bspw. ([3,2,1],"start") als Liste möglich ist.
Ich hatte einfach einmal versucht diese Liste der Funktion übergeben zu lassen und dann die Funktion ähnlich dem ersten Programm umzubauen. Dann kam allerdings irgendwas raus, was ich nicht definieren kann.
Ich brauche halt nur nen Anstoß wie ich die Listen implementieren kann...
BlackJack

@Revyn: Na genau wie im ersten Programm. :-)

Dort hast Du zusammengesetzte Werte aus Liste mit Werten für den Turm und einen Namen für den Turm. Was verwendet das zweite Programm an Werten für einen Turm? Was muss noch dazu kommen? An Werten? Und dann an Funktionalität?
BlackJack

Ich fühlte mich so an den ersten Kontakt mit den Türmen von Hanoi im Informatikunterricht erinnert, und habe mal aus reiner Nostalgie die gezeigte 4-Türme-Variante mit Ausgabe der Turminhalte in der Sprache implementiert, die wir damals verwendet haben (TurboPascal):
[codebox=delphi file=Unbenannt.pas]program TowersOfHanoi;

type
TTower = Object
size: Byte;
values: array[1..255] of Byte;
name: String[15];
procedure Init(pname: String);
procedure Fill(n: Byte);
procedure Print;
procedure MoveDiskTo(var target: TTower);
end;

var
diskCount: Byte;
source, help, help2, target: TTower;

procedure TTower.Init(pname: String);
begin
size := 0;
name := pname;
end;

procedure TTower.Fill(n: Byte); assembler;
asm
{size := n;}
mov CL, n
les DI, Self
mov [ES:DI+TTower.size], CL

{for i := 1 to n do values := n - i + 1;}
xor CH, CH
add DI, TTower.values
@L:
mov AL, CL
stosb
loop @L
end;

procedure TTower.Print;
var i: Byte;
begin
Write('(', name, ': [');
for i := 1 to size do
begin
Write(values);
if i <> size then Write(', ');
end;
Write('])');
end;

procedure PrintTowers;
begin
source.Print;
Write(' ');
help.Print;
Write(' ');
help2.Print;
Write(' ');
target.Print;
WriteLn;
end;

procedure TTower.MoveDiskTo(var target: TTower);
var disk: Byte;
begin
if size <> 0 then
begin
disk := values[size];
Dec(size);
Inc(target.size);
target.values[target.size] := disk;
WriteLn('Moving ', disk, ' from ', name, ' to ', target.name, '.');
PrintTowers;
end;
end;

procedure Hanoi(n: Byte; var source, help, target: TTower);
begin
if n > 0 then
begin
Hanoi(n - 1, source, target, help);
source.MoveDiskTo(target);
Hanoi(n - 1, help, source, target);
end
else source.MoveDiskTo(target);
end;

procedure Hanoi4(n: Byte; var source, target, help, help2: TTower);
var k: Byte;
begin
if n > 1 then
begin
k := Trunc((Sqrt(8 * n + 1) - 1) / 2);
Hanoi4(n - k, source, help, target, help2);
Hanoi(k - 1, source, help2, target);
Hanoi4(n - k, help, target, source, help2);
end
else source.MoveDiskTo(target);
end;

begin
source.Init('source');
help.Init('help');
help2.Init('help 2');
target.Init('target');

Write('How many disks? ');
Read(diskCount);
source.Fill(diskCount);
PrintTowers;
Hanoi4(diskCount, source, target, help, help2);
ReadLn;
end.[/code]
Zuletzt geändert von BlackJack am Freitag 10. Juni 2016, 23:40, insgesamt 2-mal geändert.
Grund: Fehler beseitgt, tatsächlich mit BP7 kompiliert, Inline Assembler :-)
Antworten