CloudCoder Python feladatgyujtemeny/pasziansz

A MathWikiből

Akkor van baj, ha valamelyik színből több van mint a másikból, de a legértékesebb lap nem ebből a színből van, mert akkor a másik színnel kezdjük a tevést, és így eggyel kevesebbet tudunk tenni ebből a színből, mint lehetne. Egy lehetséges megoldás, hogy miután leraktam az eredeti módszerrel minden kártyát amit lehetett, ha a maradék kártyák más színűek mint az első kártya, akkor még az első kártya elé tehetek belőlük egyet, a legértékesebbet. Ebben a megoldásban a return előtti 3 sor a módosítás:

# Ez a függvény megmondja a legjobb kirakható
# sor értékét.
def pasziansz(kez):
    # Ha egy kártyánk sincs, 0 pont a max. 
    if len(kez) == 0:
        return 0
 
    # Csökkenö sorrendbe tesszük a kártyákat.
    kez.sort(reverse=True)
 
    # Az els? kártya a legértékesebb.
    elso = kez[0]
    elozo = kez[0]
    pont = elozo[0]
    del kez[0]
 
    # Mindig megkeressük a legértékesebb lapot,
    # ami lehet a következö, mert más szinü.
    # Ezt addig csináljuk amig találunk ilyent
    talalt = True
    while talalt:
        talalt = False
        # Csökken? sorrendben végigmegyünk a kártyákon
        for i in range(len(kez)):
            lap = kez[i]
            # Ha a kártya különbözö szinü, betesszük,
            # és kitöröljük a kártyák listájáról
            if fekete(elozo) != fekete(lap):
                talalt = True
                elozo = lap
                pont += lap[0]
                del kez[i]
                break
 
    # Ha a maradek kartyakbol egy meg a sor elejere
    # teheto, tegyuk oda.
    if len(kez) != 0:
        if fekete(elso) != fekete(kez[0]):
            pont += kez[0][0]
 
    return pont
Személyes eszközök