Algoritmus cesty - obdoba TV AZ kvíz   otázka

Offtopic, Algoritmy

Dobrý den,

mám pyramidu jako v televizním AZ kvízu - 28 šestihraných políček uspořádaných do rovnoramenného trojúhelníku, vrcholy nahoře 1, dole vlevo 22, vpravo 28. Cílem hry je ze získaných polí propojit (souvisle) všechny tři hrany. Dovedu vyřešit podmínky získání hran a má-li hráč 7 a více políček, vyhrál by, pokud bude spojnice hran nepřerušená. A jsem v koncích. Vrcholy mají po dvou sousedních polí, hranová po čtyřech, vnitřní po šesti... trochu moc!

Na jakém principu se takový problém, dá vyřešit? Moc se nevyznám.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Udělejte si třídu a každé políčko reprezentujte jako instanci té třídy. U každého políčka si zapamatujete pozici a stav a dáte tam metodu GetNeighbours (sousední políčka), která bude vracet kolekci sousedních políček.

Předpokládám, že Fields je pole, kde máte uložená jednotlivá políčka a řádky máte zarovnané doleva (tzn. na prvním řádku je jedno políčko, na druhém dvě, na N-tém je jich obsazených prvních N). Pak se sousedi hledají celkem jednoduše.

Public Class GameField

    'souřadnice X
    Public Property X As Integer 

    'souřadnice Y
    Public Property Y As Integer

    'pole políček (řádky jsou zarovnané doleva)
    Public Property Fields(,) As GameField

    'vrací sousední políčka
    Public Function GetNeighbours() As List(Of GameField)
        Dim neighbours As New List(Of GameField) 

        'horní sousedi
        If Y > 0 Then
            If X < Y Then neighbours.Add(fields(X, Y - 1))
            If X + 1 < Y Then neighbours.Add(fields(X + 1, Y - 1))
        End If

        'sousedi ve stejném řádku
        If X > 0 Then neighbours.Add(fields(X - 1, Y))
        If X < Y Then neighbours.Add(fields(X + 1, Y))

        'dolní sousedi
        If Y < RowCount - 1 Then
            neighbours.Add(fields(X, Y + 1))
            neighbours.Add(fields(X + 1, Y + 1))
        End If

        Return neighbours
    End Function

End Class

S tímhle arzenálem si pak můžete snadno napsat funkci, která bude hledat cesty - tzn. nějaká varianta prohledávání do šířky.

Vytvoříte si například frontu Queue(Of GameField) a do ní nacpete libovolné políčko. Zjistíte jeho sousedy a pokud náleží danému hráči, přidáte je taky do fronty a do seznamu. Pak vždycky z fronty vytáhnete jeden prvek a jeho sousedy opět přidáte do fronty a do svého seznamu (ale pozor, jen takové sousedy, které jste ještě nezpracoval).

Jakmile se do fronty už nic přidat nedá, našel jste skupinu políček, která je souvislá. Pokud sahá na všechny tři strany, máte vyhráno.

Pokud má hráč víc skupin, které spolu nesousedí, spustíte tenhle algoritmus znovu, začnete s libovolným políčkem, které jste ještě nezpracoval.

Hledejte na Internetu - algoritmus se jmenuje něco jako "hledání komponent souvislosti".

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za cenné informace, pomohly, ale k cíli mám daleko. Byl jsem úplně vedle, pole políček jsem nezarovnával a ještě hloupě prokládal nulami a ono to jde zarovnat doleva a nevadí, že políčka jsou ve skutečnosti pod sebou ob jednu řadu...

Hledal jsem na Internetu, narážel na grafy, algoritmy různých jmen a ono jde o "hledání komponent souvislosti" a "prohledávání do šířky" - snažím se alespoň něco z toho pochopit a zatím jsem zase u grafů. Ale teď vím, že tady někde je řešení...

Nejsem (zřejmě ani nebudu) programátor, tak vlastní třída, seznam, fronta jsou věci, které se teď snažím pochopit...

Proto jsem nereagoval a nepoděkoval až teď, když vidím, že mi pochopení bude ještě nějaký čas trvat - děkuji.

Zatím je mi zžejmé hledání sousedů až na "RowCount" a nevím zatím, jak se na třídu obracet...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak si nejdříve nastudujte základy programování v nějakém .Net jazyce.Abyste znal pojmy třída,metoda,rozhraní,dědičnost,atd...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Děkuji, s Vaší pomocí mám problém vyřešený. Můžete, prosím, toto vlákno uzavřít.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback