Prihlásenie Registrácia  

C1 - Poker

Časový limit: 10s, Pamäťový limit: 64MiB

Programovacie jazyky: Pascal, C, C++, Java, C++0x, Python 3.4, Python 3.11

Počet bodov: 1

[ Pošli riešenie ] [ Tvoje riešenia ] [ Správne riešenia ] [ Vzorové riešenie ]

Vašou úlohou dnes bude napísať program, ktorý pomôže Jankovi vyhrať veľa peňazí v hre poker.

Poker, konkrétne teda jeho variant hold'em, sa hrá tak, že každému hráčovi sa rozdajú 2 karty (tieto ostatní hráči nevidia) a na stôl sa vyloží ďalších 5 kariet, ktoré vidia všetci hráči. Každý hráč si zo všetkých 7 kariet, ktoré vidí (teda dvoch svojich a piatich spoločných) zvolí 5 kariet tak, aby zvolená pätica mala čo najväčšiu hodnotu. Vyhráva (a všetky peniaze si berie) hráč, ktorého pätica má najväčšiu hodnotu.

Hrá sa so štandardnými „medzinárodnými“ kartami štyroch farieb – ♥ srdcia (hearts), ♠ piky (spades), ♣ trefy (clubs) a ♦ kára (diamonds) – po trinásť hodnôt – v poradí od najhodnotnejšej po najmenej hodnotnú A, K, Q, J, T (10), 9, 8, 7, 6, 5, 4, 3, 2. V pokri hodnota karty nezávisí od farby, teda existujú karty rovnakých hodnôt a môže dôjsť aj k remíze medzi dvoma alebo viacerými hráčmi.

„Pokrové ruky“, teda pätice kariet, sú v poradí od najhodnotnejšej po najmenej hodnotnú:

  1. straight flush (postupka vo farbe) – všetkých 5 kariet je rovnakej farby a ich hodnoty nasledujú tesne po sebe v spomínanom poradí. Ak má viacero hráčov straight flush, vyhráva ten, ktorého postupka má najvyššiu kartu najvyššej hodnoty. Navyše aj pätica 5, 4, 3, 2, A sa považuje za platnú postupku, avšak v tomto prípade sa za kartu najvyššej hodnoty počíta 5.
  2. poker (štvorica) – štyri karty majú rovnakú hodnotu, piata je ľubovoľná. Ak má viacero hráčov štvoricu, vyhráva ten, ktorého štvorica sa skladá z kariet vyššej hodnoty. Ak má viacero hráčov štvoricu rovnakej hodnoty, vyhráva ten, ktorého zvyšná jedna karta má vyššiu hodnotu.
  3. full house (trojica a dvojica) – hráčova ruka sa skladá z troch kariet rovnakej hodnoty a ďalších dvoch kariet inej, ale tiež rovnakej hodnoty. Ak má viacero hráčov full house, vyhráva ten, ktorý má trojicu kariet vyššej hodnoty. Ak ani toto kritérium nerozhodne o víťazovi, vyhráva ten, ktorý má dvojicu kariet vyššej hodnoty.
  4. flush (farba) – všetkých 5 kariet je rovnakej farby. Ak má viacero hráčov flush, porovnávajú sa ich najvyššie karty. Ak sú tieto rovnaké, porovnávajú sa druhé najvyššie karty, a tak ďalej až po ich najnižšie (piate najvyššie) karty.
  5. straight (postupka) – hodnoty všetkých 5 kariet nasledujú tesne po sebe v spomínanom poradí, môžu však byť rôznych farieb. Podobne ako pri straight flushi, ak má viacero hráčov straight, vyhráva ten, ktorého postupka má najvyššiu kartu najvyššej hodnoty, a tiež pätica 5, 4, 3, 2, A sa považuje za platnú postupku, za ktorej najvyššiu kartu sa počíta 5.
  6. trojica – hráčova ruka obsahuje tri karty rovnakej hodnoty, zvyšné dve sú ľubovoľné, ale rôzne. Ak má viacero hráčov trojicu, vyhráva ten, ktorý má trojicu kariet najvyššej hodnoty. Ak má viacero hráčov trojicu kariet rovnakej hodnoty, vyhráva ten, ktorý má vyššiu zo zvyšných dvoch kariet najvyššej hodnoty, a ak ani toto kritérium nerozhodne, vyhráva ten, ktorý má nižšiu zo zvyšných dvoch kariet najvyššej hodnoty.
  7. dve dvojice – hráč má dva páry kariet rovnakej hodnoty a jednu ľubovoľnú kartu inej hodnoty. Ak má viacero hráčov dve dvojice, porovnáva sa najprv hodnota kariet z vyššej dvojice, potom hodnota kariet z nižšej dvojice a na záver hodnota poslednej, nespárovanej karty.
  8. dvojica – hráč má dve karty rovnakej hodnoty a zvyšné tri karty ľubovoľné, rôznych hodnôt. Ak má viacero hráčov dvojicu, porovnáva sa najprv hodnota kariet z tejto dvojice a potom hodnoty zvyšných troch kariet v poradí od najvyššej.
  9. Ak hráči nemajú žiadne z uvedených rúk, porovnáva sa ich najvyššia karta, potom druhá najvyššia karta, a tak ďalej až po najnižšiu (piatu) kartu.

Vo všetkých prípadoch môže dôjsť k remíze, ak žiadne z uvedených kritérií nerozhodne o víťazovi.

Úloha

Daný je počet hráčov, hodnoty a farby dvoch kariet, ktoré dostal Janko a piatich spoločných kariet. Vašou úlohou je vypočítať pravdepodobnosť, že Janko toto kolo vyhrá (teda prehry ani remízy nepočítajte).

Vstup

Prvý riadok vstupu obsahuje dve celé čísla K a T (T ≤ 20). Číslo K určuje počet hráčov (rovnaký pre všetky vstupné sady) a číslo T určuje počet vstupných sád. Nasledujúcich T riadkov obsahuje označenia 7 kariet oddelené medzerami, pričom prvé dve karty sú Jankove tajné a ďalších 5 je spoločných. Označenie karty je tvorené dvoma znakmi, prvý reprezentuje jej hodnotu (A, K, Q, J, T, 9, 8, 7, 6, 5, 4, 3, 2) a druhý reprezentuje jej farbu (C, D, H, S).

Výstup

Pre každú sadu zo vstupu vypíšte pravdepodobnosť, že Janko vyhrá. Výsledok uveďte s presnosťou na maximálne osem desatiných miest. Akceptované budú len riešenia, ktorých výsledok sa od správneho výsledku líši najviac o hodnotu 0,001.

C1

K = 2

C2

2 ≤ K ≤ 4

Príklad

Vstup:

2 3
AS AH AC 5C 3C 2C 4C
AS AH AC 6C 3C 2D 4C
AS AH AC 6H 3C 2D 4S

Výstup:

0
0.53333333
0.82828283

Vysvetlenie:

V prvom prípade spoločné karty tvoria straight flush s najvyššou kartou 5, Jankove dve esá teda vôbec nie sú súčasťou najlepšej pätice, ktorú si môže zvoliť. Päť spoločných kariet si však môže zvoliť aj druhý hráč, a teda Janko môže prinajlepšom remízovať (môže dokonca prehrať, napríklad ak by jeho súper mal 6C, a teda si zvolil päticu 2C 3C 4C 5C 6C).

V druhom prípade Janko má tri esá. Jeho súper môže vyhrať, ak by mal ľubovoľnú kartu 5, a teda získal postupku, alebo ak by mal ľubovoľnú trefovú kartu a teda flush. (Jankov súper nemôže mať tri esá, keďže tieto sú dokopy len štyri a dve z nich má Janko na ruke.)

V poslednom prípade Janko má opäť tri esá, narozdiel od druhého prípadu sa ale zo spoločných kariet a žiadnych dvoch ďalších kariet nedá poskladať flush. Jankov súper teda vyhrá len v prípade, že bude mať na ruke ľubovoľnú kartu 5, a teda postupku.