using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Threading; namespace BilaPani { public static class mapa { public enum TypPole { Nic, BilaPani, Zed, Zved, Televize, PohybyZveda }; public static TypPole[,] dataMapy; public static Point poziceCile; volatile public static int[,] cesta; public static List trasaCesty; private static int indexBilePaniNaTrase; private static Point BilaPani; private static Point StartovniPozice; public static TypPole ZiskatPoleZCharu(char c, int poziceX, int poziceY) { switch (c) { case '&': BilaPani = new Point(poziceX, poziceY); return TypPole.BilaPani; case 'X': return TypPole.Zed; case '.': return TypPole.Nic; case '#': poziceCile = new Point(poziceX, poziceY); return TypPole.Televize; case '@': return TypPole.Zved; default: return TypPole.PohybyZveda; } } public static bool JePohybZveda(char c) { switch (c) { case '<': case '>': case '^': case 'v': return true; default: return false; } } public static int NajdiCestu() { PripravitPoleCest(); trasaCesty = new List(); trasaCesty.Add(BilaPani); indexBilePaniNaTrase = 0; StartovniPozice = BilaPani; int hornilimit = 1; for (int i = 0; i < hornilimit; i++) { Thread vlakno1 = new Thread(new ThreadStart(ref CyklusVlevoNahoru)); Thread vlakno2 = new Thread(new ThreadStart(ref CyklusPravoNahoru)); Thread vlakno3 = new Thread(new ThreadStart(ref CyklusVlevoDolu)); Thread vlakno4 = new Thread(new ThreadStart(ref CyklusPravoDolu)); Thread vlakno6 = new Thread(new ThreadStart(ref CyklusKomplet1)); Thread vlakno7 = new Thread(new ThreadStart(ref CyklusKomplet2)); Thread vlakno8 = new Thread(new ThreadStart(ref CyklusKomplet3)); Thread vlakno9 = new Thread(new ThreadStart(ref CyklusKomplet4)); vlakno1.Start(); vlakno3.Start(); vlakno2.Start(); vlakno4.Start(); Thread.Sleep(100); vlakno6.Start(); Thread.Sleep(20); vlakno7.Start(); Thread.Sleep(20); vlakno8.Start(); Thread.Sleep(20); vlakno9.Start(); vlakno1.Join(); vlakno2.Join(); vlakno3.Join(); vlakno4.Join(); vlakno6.Join(); vlakno7.Join(); vlakno8.Join(); vlakno9.Join(); if(i>3) if (!ZkusNajitCestu(i) && hornilimit<10) hornilimit++; } //Vykreslovani.VykreslitCisla(cesta); BilaPani = StartovniPozice; indexBilePaniNaTrase = 0; return trasaCesty.Count - 1; } private static void ProjitSkrzZed() { Point pozice = BilaPani; int docX = pozice.X - 1; int docY = pozice.Y; if (docX >= 0) if (dataMapy[docX, docY] == TypPole.Zed) { dataMapy[docX, docY] = TypPole.Nic; return; } docX = pozice.X + 1; if (docX < cesta.GetLength(0)) if (dataMapy[docX, docY] == TypPole.Zed) { dataMapy[docX, docY] = TypPole.Nic; return; } docX = pozice.X; docY = pozice.Y + 1; if (docY < cesta.GetLength(1)) if (dataMapy[docX, docY] != TypPole.Zed) { dataMapy[docX, docY] = TypPole.Nic; return; } docY = pozice.Y - 1; if (docY >= 0) if (dataMapy[docX, docY] != TypPole.Zed) { dataMapy[docX, docY] = TypPole.Nic; return; } } private static bool ZkusNajitCestu(int cislo) { BilaPani = StartovniPozice; int kontrola = 0; while (!PosunBilePani(0)) { mapa.PosunBilePani(1); kontrola++; if (cislo>3 && kontrola>2400) { ProjitSkrzZed(); kontrola = 0; } if (kontrola > 6400) return false; } return true; } public static bool PosunBilePani(int oKolik) { if(oKolik>0) for (int i = 0; i < oKolik; i++) { dataMapy[BilaPani.X, BilaPani.Y] = TypPole.Nic; BilaPani = ZjistiNejmensiCisloVOkoliVratitSouradnici(BilaPani); dataMapy[BilaPani.X, BilaPani.Y] = TypPole.BilaPani; trasaCesty.Add(BilaPani); indexBilePaniNaTrase++; Vykreslovani.PrevestMapuDoPoleBarev(); } else if(oKolik<0) for (int i = 0; i < Math.Abs(oKolik); i++) { if (indexBilePaniNaTrase < 1) break; dataMapy[BilaPani.X, BilaPani.Y] = TypPole.Nic; indexBilePaniNaTrase--; BilaPani = trasaCesty.ElementAt(indexBilePaniNaTrase); dataMapy[BilaPani.X, BilaPani.Y] = TypPole.BilaPani; Vykreslovani.PrevestMapuDoPoleBarev(); } if (BilaPani == poziceCile) return true; return false; } private static Point ZjistiNejmensiCisloVOkoliVratitSouradnici(Point pozice) { int nejmensi = cesta[pozice.X, pozice.Y]; Point bod = pozice; int docX = pozice.X - 1; int docY = pozice.Y; if (docX >= 0) if (cesta[docX, docY] < nejmensi) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docX = pozice.X + 1; if (docX < cesta.GetLength(0)) if (cesta[docX, docY] < nejmensi) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docX = pozice.X; docY = pozice.Y + 1; if (docY < cesta.GetLength(1)) if (cesta[docX, docY] < nejmensi) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docY = pozice.Y - 1; if (docY >= 0) if (cesta[docX, docY] < nejmensi) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } return bod; } private static Point ZjistiNejvetsiCisloVOkoliVratitSouradnici(Point pozice) { int nejmensi = cesta[pozice.X, pozice.Y]; Point bod = pozice; int docX = pozice.X - 1; int docY = pozice.Y; if (docX >= 0) if (cesta[docX, docY] > nejmensi && dataMapy[docX,docY]!= TypPole.Zed) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docX = pozice.X + 1; if (docX < cesta.GetLength(0)) if (cesta[docX, docY] > nejmensi && dataMapy[docX, docY] != TypPole.Zed) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docX = pozice.X; docY = pozice.Y + 1; if (docY < cesta.GetLength(1)) if (cesta[docX, docY] > nejmensi && dataMapy[docX, docY] != TypPole.Zed) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } docY = pozice.Y - 1; if (docY >= 0) if (cesta[docX, docY] > nejmensi && dataMapy[docX, docY] != TypPole.Zed) { bod = new Point(docX, docY); nejmensi = cesta[docX, docY]; } return bod; } private static void PripravitPoleCest() { cesta = new int[dataMapy.GetLength(0), dataMapy.GetLength(1)]; for (int x = 0; x < cesta.GetLength(0); x++) for (int y = 0; y < cesta.GetLength(1); y++) cesta[x, y] = int.MaxValue - 150; cesta[poziceCile.X, poziceCile.Y] = 0; } private static int ZjistiNejmensiCisloVOkoli(int PozX, int PozY) { int[] okoli = new int[4]; int docX = PozX - 1; int docY = PozY; if (docX >= 0) okoli[0] = cesta[docX, docY]; else okoli[0] = Int32.MaxValue; docX = PozX + 1; if (docX < cesta.GetLength(0)) okoli[1] = cesta[docX, docY]; else okoli[1] = Int32.MaxValue; docX = PozX; docY = PozY + 1; if (docY < cesta.GetLength(1)) okoli[2] = cesta[docX, docY]; else okoli[2] = Int32.MaxValue; docY = PozY - 1; if (docY >= 0 ) okoli[3] = cesta[docX, docY]; else okoli[3] = Int32.MaxValue; okoli = SeraditCisla(okoli); return okoli[0]; } private static int[] SeraditCisla(int[] pole) { for(int i=0;i<=3;i++) for (int a = 1; a < pole.Length; a++) { if (pole[a] < pole[a - 1]) { int doc = pole[a]; pole[a] = pole[a - 1]; pole[a - 1] = doc; } } return pole; } static int opakovaniCyklu = 20; private static void CyklusKomplet1() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = 0; x < dataMapy.GetLength(0); x++) { for (int y = 0; y =0 ; x--) { for (int y = 0; y < dataMapy.GetLength(1); y++) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusKomplet3() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = dataMapy.GetLength(0) - 1; x >= 0; x--) { for (int y = dataMapy.GetLength(1) -1; y >=0; y--) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusKomplet4() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = 0; x < dataMapy.GetLength(0); x++) { for (int y = dataMapy.GetLength(1) - 1; y >= 0; y--) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusVlevoNahoru() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = poziceCile.X; x >= 0; x--) { for (int y = poziceCile.Y; y >= 0; y--) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusPravoNahoru() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = poziceCile.X; x < cesta.GetLength(0); x++) { for (int y = poziceCile.Y; y >= 0; y--) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusVlevoDolu() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = poziceCile.X; x >= 0; x--) { for (int y = poziceCile.Y; y < cesta.GetLength(1); y++) { if (x == poziceCile.X && y == poziceCile.Y) continue; if (dataMapy[x, y] != TypPole.Zed) cesta[x, y] = ZjistiNejmensiCisloVOkoli(x, y) + 1; else cesta[x, y] = int.MaxValue; } } } } private static void CyklusPravoDolu() { for (int i = 0; i < opakovaniCyklu; i++) { for (int x = poziceCile.X; x < cesta.GetLength(0); x++) { for (int y = poziceCile.Y; y