Exemplo n.º 1
0
        private List <Koordináta> CsatlakozókEhhez(Koordináta start)
        {
            /// <summary>
            /// Visszaad egy listát a start ponthoz csatlakozó mezőhöz
            /// Csatlakozó mező = el lehet jutni a start pontból hozzá csak azonos típusú mezőkön
            /// </summary>

            /// <returns>
            /// Minden olyan mező ahová el lehet jutni
            /// </returns>

            /// <param name="start">
            /// Ehhez keres csatlakozó mezőket
            /// </param>

            var üres = this[start] == Típus.Üres;

            // Dijsktra féle gráf útvonal keresés
            var eredmeny = new List <Koordináta>();

            // 0. lépés:) Kezdő pont és kezdő útvonalak felvétele
            eredmeny.Add(start);

            var utvonalak = üres ? ÜresSzomszédok(start) : NemÜresSzomszédok(start);

            // 1. lépés) Az összes többi lépés szimulálása
            while (utvonalak.Count > 0)
            {
                var kovetkezoUtvonalak = new List <Koordináta>(); // Következő lépés adatai

                foreach (var célPont in utvonalak)
                {
                    // Egy út szimulálása
                    // var kezdőPont = út.KezdőPont; // Nem tudom hogy ezt miért szerettem volna

                    if (eredmeny.Any(e => e.Equals(célPont)))
                    {
                        // Ha az adott ponthoz már korábban eljutott az útvonalkeresés
                        // Akkor most hagyja ki
                        // Így elkerüli a végtelen ciklust (kör a gráfban)
                        continue;
                    }

                    // Egyébként vegye fel az eredmények közé
                    eredmeny.Add(célPont);

                    // És mentse el a hozzá tartozó utakat
                    var szomszedok = üres ? ÜresSzomszédok(célPont) : NemÜresSzomszédok(célPont);

                    szomszedok
                    .ForEach(x => kovetkezoUtvonalak.Add(x));
                }

                utvonalak = kovetkezoUtvonalak;
            }

            return(eredmeny);
        }
Exemplo n.º 2
0
 private Típus this[Koordináta k]
 {
     get
     {
         return(this[k.x, k.y]);
     }
     set
     {
         this[k.x, k.y] = value;
     }
 }
Exemplo n.º 3
0
        private List <Koordináta> Szomszédok(Koordináta start, Func <Típus, bool> szomszédTípusSzűrő)
        {
            /// <summary>
            /// Minden szomszéd, ami a szomszédTípusSzűrő-nek megfelel
            /// </summary>

            /// <param name="szomszédTípusSzűrő">
            /// Egy olyan függvény, amely a szomszéd típusa alapján szűr
            /// </param>
            ///

            /// UNSAFE ÖTLET: Minden lehetséges szomszéd visszaadása és külső szűrés
            /// CONS: Könnyen lemaradhat a szűrés

            var eredmeny = new List <Koordináta>();

            bool mehetFel    = start.y - 1 >= 0;
            bool mehetLe     = start.y + 1 < Magasság;
            bool mehetBalra  = start.x - 1 >= 0;
            bool mehetJobbra = start.x + 1 < Szélesség;

            if (mehetBalra && szomszédTípusSzűrő(this[start.x - 1, start.y]))
            {
                eredmeny.Add(new Koordináta(start.x - 1, start.y));
            }
            if (mehetJobbra && szomszédTípusSzűrő(this[start.x + 1, start.y]))
            {
                eredmeny.Add(new Koordináta(start.x + 1, start.y));
            }
            if (mehetFel && szomszédTípusSzűrő(this[start.x, start.y - 1]))
            {
                eredmeny.Add(new Koordináta(start.x, start.y - 1));
            }
            if (mehetLe && szomszédTípusSzűrő(this[start.x, start.y + 1]))
            {
                eredmeny.Add(new Koordináta(start.x, start.y + 1));
            }

            return(eredmeny);
        }
Exemplo n.º 4
0
 private List <Koordináta> NemÜresSzomszédok(Koordináta start)
 {
     return(Szomszédok(start, t => t != Típus.Üres));
 }
Exemplo n.º 5
0
        private void SzobaMegszámlálás()
        {
            int eredmény = 0; // Szobák száma

            /// <summary>
            /// Megkeresi a szobákat
            /// Majd megszámolja, hogy hány darab szoba van
            /// </summary>

            // Minden szobába nem tartozó mező összegyűjtése
            List <Koordináta> nemIsmertÜresek = new List <Koordináta>();

            for (int x = 0; x < Szélesség; x++)
            {
                for (int y = 0; y < Magasság; y++)
                {
                    Koordináta k = new Koordináta(x, y);
                    if (this[k] == Típus.Üres)
                    {
                        nemIsmertÜresek.Add(k);
                    }
                }
            }

            // szoba = fallal körülzárt terület
            while (nemIsmertÜresek.Count != 0)
            {
                // nemIsmertÜresek -= szoba

                Koordináta start = nemIsmertÜresek[0];

                // Annak megállapítása, hogy körbe van-e zárva
                bool épületenBelül = true;
                {
                    int elsőFalIndex   = 999999999;
                    int utolsóFalIndex = 0;
                    for (int x = 0; x < Szélesség; x++)
                    {
                        if (this[x, start.y] == Típus.Fal)
                        {
                            elsőFalIndex   = Math.Min(elsőFalIndex, x);
                            utolsóFalIndex = x;
                        }
                    }

                    if (elsőFalIndex > start.x || utolsóFalIndex < start.x)
                    {
                        épületenBelül = false;
                    }
                }
                {
                    int elsőFalIndex   = 999999999;
                    int utolsóFalIndex = 0;
                    for (int y = 0; y < Magasság; y++)
                    {
                        if (this[start.x, y] == Típus.Fal)
                        {
                            elsőFalIndex   = Math.Min(elsőFalIndex, y);
                            utolsóFalIndex = y;
                        }
                    }

                    if (elsőFalIndex > start.y || utolsóFalIndex < start.y)
                    {
                        épületenBelül = false;
                    }
                }

                // Csatlakozó mezők megkeresése
                List <Koordináta> üresRész = CsatlakozókEhhez(start);

                if (épületenBelül)
                {
                    eredmény += 1;
                }

                // nemismert üresek -= szoba
                foreach (var k in üresRész)
                {
                    nemIsmertÜresek = nemIsmertÜresek.Where(k1 => !k1.Equals(k)).ToList();
                }
            }

            SzobákSzáma = eredmény;
        }
Exemplo n.º 6
0
 public bool Equals(Koordináta k2)
 {
     return(x == k2.x && y == k2.y);
 }