Die Webseiten der Fachschaft Informatik am ERG Saalfeld


Hilfeseite - Position der Scheiben bei "Türme von Hanoi"


 

Auf der Hilfe-Seite "vorbereitung.html" wurde angegeben, dass die print_at-Anweisung bei mir die Koordinaten von (0;0) - "Ecke links oben" - bis (22;122) - Ecke rechts unten- verwenden kann. Ich habe deshalb mal "per Hand" die Scheiben auf den Desktop plaziert, um dann eine Formel für Koordinaten zu überlegen. Da sah so aus:

 


Das Programm für diese Darstellung (mit viel "Copy & Paste" erstellt) sah so aus:

from ctypes import *

STD_OUTPUT_HANDLE = -11

class COORD(Structure):
    pass

COORD._fields_ = [("X", c_short), ("Y", c_short)]

def print_at(r, c, s):
    h = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
    windll.kernel32.SetConsoleCursorPosition(h, COORD(c, r))

    c = s.encode("windows-1252")
    windll.kernel32.WriteConsoleA(h, c_char_p(c), len(c), None, None)

#print_at(6, 3, "Hello")

# Quelle:  https://rosettacode.org/wiki/Terminal_control/Cursor_positioning#Python


my_disc = ["                       ",
           "          ###          ",
           "         XXXXX         ",
           "        &&&&&&&        ",
           "       %%%%%%%%%       ",
           "      $$$$$$$$$$$      ",
           "     #############     ",
           "    XXXXXXXXXXXXXXX    ",
           "   &&&&&&&&&&&&&&&&&   ",
           "  %%%%%%%%%%%%%%%%%%%  ",
           " $$$$$$$$$$$$$$$$$$$$$ ",
           "#######################"]

boden   = " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"


print_at(17, 0, boden)


print_at(6, 3,  my_disc[1])
print_at(7, 3,  my_disc[2])
print_at(8, 3,  my_disc[3])
print_at(9, 3,  my_disc[4])
print_at(10, 3, my_disc[5])
print_at(11, 3, my_disc[6])
print_at(12, 3, my_disc[7])
print_at(13, 3, my_disc[8])         # 4. Scheibe
print_at(14, 3, my_disc[9])         # 3. Scheibe
print_at(15, 3, my_disc[10])        # 2. Scheibe
print_at(16, 3, my_disc[11])        # 1. Scheibe

print_at(6, 40,  my_disc[1])
print_at(7, 40,  my_disc[2])
print_at(8, 40,  my_disc[3])
print_at(9, 40,  my_disc[4])
print_at(10, 40, my_disc[5])
print_at(11, 40, my_disc[6])
print_at(12, 40, my_disc[7])
print_at(13, 40, my_disc[8])
print_at(14, 40, my_disc[9])
print_at(15, 40, my_disc[10])
print_at(16, 40, my_disc[11])

print_at(6, 77,  my_disc[1])
print_at(7, 77,  my_disc[2])
print_at(8, 77,  my_disc[3])
print_at(9, 77,  my_disc[4])
print_at(10, 77, my_disc[5])
print_at(11, 77, my_disc[6])
print_at(12, 77, my_disc[7])
print_at(13, 77, my_disc[8])
print_at(14, 77, my_disc[9])
print_at(15, 77, my_disc[10])
print_at(16, 77, my_disc[11])

print_at(4, 101, "pos_oben")

for i in range(6,17,1):
    print_at(i, 105, str(i))

print_at(18, 3,  "|")
print_at(18, 40, "|")
print_at(18, 77, "|")

print_at(19, 3,  "3")
print_at(19, 40, "40")
print_at(19, 77, "77")
print_at(19, 92, "<-  pos_rechts")


# diese Anweisung dient dazu, dass der Pfad am Ende unter den Türmen ist
print_at(22, 3, "Bin fertig!\n\n")


Der linke Stab bekommt die Nummer 1, der mittlere Stab die 2 und der rechte Stab die Nummer 3.

Um die Gleichungen aufzustellen, nehme ich folgenden Ansatz:

Für den 1. Parameter von print_at:

16 = a * 1 + b     #1. Scheibe
15 = a * 2 + b     #2. Scheibe

Als Ergebnis erhält man a = -1 und b = 17. Daraus ergibt sich die Gleichung: pos_oben = 17 - scheiben_nr_auf_stab

Für den 2. Parameter von print_at:

40 = a * 2 + b
 3 = a * 1 + b

Als Ergebnis erhält man a = 37 und b = 34. Daraus ergibt sich die Gleichung: pos_rechts = 37 * stab - 34

 

zurück


© ERG Saalfeld   -   HD. Kirmse 27.04.2023