Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím. Nedávno jsem narazil na docela zajímavou úlohu z teorie her - jedná se o tzv. NIM hru. Tohle je speciální, méně známá modifikace, na kterou jsem narazil - zkusím vysvětlit:
--
Máme hromádku s kameny. Hru hrají dva hráči, kteří se střídají v tazích. Tahem rozumíme odebrání jednoho až
kamenů z hromádky. Navíc hráč nesmí odebrat stejný počet kamenů, jako odebral soupeř ve svém minulém tahu. Kdo nemůže táhnout, prohrál*.
--
Úkolem je určit v závislosti na číslech , zda je výchozí pozice vyhrávající** a pokud ano, popsat nějak jednoduše strategii, která povede k vítězství.
--
Poznámky:
*což nutně neznamená, že už na hromádce nezbyl žádný kámen. Například pokud na hromádce zbyl jeden kámen, ale poslední tah soupeře bylo odebrání jednoho kamene, nelze už táhnout (tah by byl stejný, jako ten minulý) a tudíž je hra u konce.
** vyhrávající pozice je taková, že pokud budeme hrát optimálně a neuděláme chybu, soupeř se může snažit jak chce a stejně vždycky prohraje
Offline
no da sa pomerne jednoducho popisat algoritmus ktory urci vitazne pozicie, ale nejaky nazorny abstrakny popis, resp. nieco ako "vzorec" som v tom nevidel - tak by ma zaujimalo ako si to myslel
ci teda napisat ten algoritmus alebo nejaky explicitny vzorec co to rozhodne ?
Offline
↑ Brano: Spíš mi jde o ten vzorec. Algoritmus je jednoduchý - pracuje rekurentně. Definuješ si nějaký stavový prostor - ten bude dvojdimenzionální (veškerá informace o aktuálním stavu hry je shrnuta ve dvou číslech - počet kamenů na hromádce a poslední zahraný tah). Ve stavovém prostoru si definuješ nějaké výchozí prohrávající pozice. A pak řekneš, že vyhrávající je každá taková, z níž existuje aspoň jeden tah, jímž se dostaneš do prohrávající pozice. Prohrávající pozice je pak taková, která není vyhrávající (tj. taková, z níž veškeré přípustné tahy vedou pouze do vyhrávajících pozic). Rekurence je pak vedená skrze počet kamenů na hromádce - každý přípustný tah totiž nutně počet kamenů sníží.
Offline
↑ Anonymystik:
ved presne tak som si ho premyslel aj ja, ale vzorec zatial nic
Offline
↑ Anonymystik:
A co kdyz zacinajici hrac odebere N kamenu? Druhy hrac automaticky prohral, protoze uz nezbyl zadny kamen. Nebo to ma jeste nejake jine omezeni?
Offline
↑ Ondrik_B: V tahu můžeš odebrat 1 až k kamenů. Pokud je N větší než k, tak tvůj tah by byl nepřípustný.
Offline
Náhodou jsem narazil na toto téma. Existují pro nějaké k výherní počty kamenů, ze kterých by se dalo něco vykoukat?
Netriviální případy jsou ty, kdy k je liché. Taky si myslím že pokud obecně je [mathjax]k+1=2^m.(2c+1)[/mathjax] pro m sudé, pak je to taky snadné - pokud soupeř zvolí (k+1)/2, já zvolím (k+1)/4, atd.... A snahou je se po svém tahu dostat na násobek k+1.
A pro m liché mi to připadá, že proherní pozice budou právě ty (myšleno na začátku hry), u kterých je počet kamenů o 1 větší než nějaký násobek k+1.
Offline
↑ check_drummer:
Ahoj,
N=12, k=11 ....kdo začíná, prohraje
N=23, k=11 ....kdo začíná, vyhraje
výsledek asi taky závisí na N
Offline
Hra může mít nejvýše k tahů.
Myslím, že když je N větší než součet všech čísel od 1 do k, záleží jenom na tom, jestli je k liché nebo sudé. Pro liché k vyhraje ten, kdo začal, pro sudé k prohraje. Bez ohledu na to, kdo jak tahá.
Offline
Rekurzivní algoritmus se dá napsat podle mě velmi jednoduše, je to jedna funkce s pár podmínkami.
Ale obecné řešení - podle mě by se na to zase muselo jít indukcí - co se stane, když zvýšíme n o jedničku, nebo k o jedničku. Ale jestli to jde, to netuším.
Rozhodně existují algoritmy (nebo funkce) které nejsou "primitivně rekurzivní", tedy že je nelze převést na nějaký cyklus (v matematice sumu přes všechna i).
Offline
↑ osman:
Samozřejmě, to se dá intuitivně čekat.
Offline
↑ osman:
Hra můžemít libovlný počet tahů, záleží to hodnotách čísel N,k. Např. je-li N>k.x, tak hra bude mít alespoň x tahů.
Offline
↑ MichalAld:
Nemusí se na to jít jen zvýšením o jedničku - a jak jsem psal, sudká k jsou jasná....
Offline
Hra můžemít libovlný počet tahů, záleží to hodnotách čísel N,k. Např. je-li N>k.x, tak hra bude mít alespoň x tahů.
Hra může mít vždy nejvýše k tahů, protože můžeme každé číslo od 1 do k odečíst pouze jednou, řekl bych
Offline
↑ osman:
To ne, není povoleno odebrat tolik kamenů, kolik odebral soupeř ve svém minulém tahu - a to chápu tak že "v bezprostředně předcházejícím" a ne "v některém z minulých". Kdyby to bylo v libovolném z předcházejících, tak by zadavatel napsal "v některém z minulých" a ne "v minulém" - což právě evokuje jeden konkrétní tah, ten poslední.
A rovněž je to zřejmé také z poznámky zadavatele #3, kde hovoří o stavovém prostoru.
Offline
↑ check_drummer:
Asi máš pravdu, tak jsem řešil jinou úlohu 🙂
Škoda, už to vypadalo dobře...
Offline
↑ osman:
... a ta by byla ještě o dost těžší....
Offline