Esempio n. 1
0
        static void Main(string[] args)
        {
            DateTime now1 = DateTime.Now;

            string[] lines = System.IO.File.ReadAllLines("in.txt");
            Parcare parcare = new Parcare(lines);
            parcare.afisare();
            Console.WriteLine();

            Euristica euristica = new Euristica();
            CautareCaleAStar cautareCale = new CautareCaleAStar(euristica);

            RezultatCautare rezultatCautare = cautareCale.cautare(parcare);
            using (StreamWriter writer = new StreamWriter("out.txt"))
            {
                writer.WriteLine(rezultatCautare.NrParcariPartiale);
                writer.WriteLine();
                Console.WriteLine(rezultatCautare.ParcariPartiale.Count);
                foreach (Parcare parcarePartiala in rezultatCautare.ParcariPartiale)
                    writer.WriteLine(parcarePartiala.afisare());
            }

            DateTime now2 = DateTime.Now;
            Console.WriteLine(now2 - now1);
        }
        public RezultatCautare cautare(Parcare parcareInitiala)
        {
            Parcare parcareCurenta;
            Queue<Parcare> coadaParcari = new Queue<Parcare>();
            coadaParcari.Enqueue(parcareInitiala);

            while (coadaParcari.Count != 0)
            {
                parcareCurenta = coadaParcari.Dequeue();
                List<Mutare> mutari = parcareCurenta.mutariPosibile();
                foreach (Mutare mutare in mutari)
                {
                    Parcare parcareNoua = parcareCurenta.aplicaMutare(mutare);
                   // parcareNoua.afisare();
                   // parcareNoua.afisareOcupareParcare();
                    if (!contains(coadaParcari, parcareNoua))
                    {
                        Console.WriteLine("nu");
                        if (parcareNoua.SfarsitJoc)
                        {
                            Console.WriteLine("Jocul s-a incheiat cu succes!!!");
                            return refacereTraseu(parcareNoua);
                        }
                        coadaParcari.Enqueue(parcareNoua);
                    }
                    Console.WriteLine("contine");
                }
            }
            return new RezultatCautare();
        }
 private bool contains(Queue<Parcare> parcari, Parcare parcareNoua)
 {
     foreach (Parcare parcare in parcari)
     {
         if (parcare.Equals(parcareNoua))
             return true;
     }
     return false;
 }
        /// <summary>
        /// Metoda ce calculeaza distanta pana la iesire adunand mai multe rezultate: nuamrul de masini ce se afla intre masina rosie si iesire,
        /// distanta Manhattan a masinii rosii si iesire,
        /// numarul de masini ce se pot misca la un moment dat.
        /// </summary>
        /// <param name="parcare"></param>
        /// <returns></returns>
        public int distantaPanaLaIesire(Parcare parcare)
        {
            int hScor;
            Masina masinaRosie = null;
            foreach (Masina masina in parcare.Masini)
            {
                if (!masina.EsteRosie)
                    continue;
                masinaRosie = masina;
                break;
            }

            int distanta = 0;
            int posYIesire;
            int posXIesire;

            if (masinaRosie.TipMasina == TipMasinaEnum.MasinaOrizontala)
            {
                posYIesire = parcare.PozitieCaracterIesire - masinaRosie.PozitieX * (parcare.LatimeParcare - 1);
                posXIesire = masinaRosie.PozitieX;
                if (posYIesire == 0)
                    for (int i = masinaRosie.PozitieY - 1; i > 0; i--)
                    {
                        if (parcare.OcupareParcare[masinaRosie.PozitieX, i] == true)
                            distanta++;
                    }
                else if (posYIesire == parcare.LatimeParcare - 1)
                    for (int i = masinaRosie.PozitieY + masinaRosie.Lungime; i < parcare.LatimeParcare - 1; i++)
                        if (parcare.OcupareParcare[masinaRosie.PozitieX, i] == true)
                            distanta++;
            }
            else
            {
                posYIesire = parcare.PozitieCaracterIesire % (parcare.LungimeParcare - 1);
                posXIesire = (parcare.PozitieCaracterIesire - posYIesire) / parcare.LatimeParcare;
                if (posXIesire == 0)
                    for (int i = masinaRosie.PozitieX - 1; i > 0; i--)
                    {
                        if (parcare.OcupareParcare[i, masinaRosie.PozitieY] == true)
                            distanta++;
                    }
                else if (posXIesire == parcare.LatimeParcare - 1)
                    for (int i = masinaRosie.PozitieX + masinaRosie.Lungime; i < parcare.LatimeParcare - 1; i++)
                        if (parcare.OcupareParcare[i, masinaRosie.PozitieY] == true)
                            distanta++;
            }
             //   if (distanta <= 1)
              //      return distanta;

            hScor = 10 * distanta + parcare.Masini.Count - masiniLibere(parcare) + distantaMahattan(masinaRosie, posXIesire, posYIesire);
            return hScor;
        }
 private RezultatCautare refacereTraseu(Parcare parcare)
 {
     List<Parcare> parcariPartiale = new List<Parcare>();
     parcariPartiale.Add(parcare);
     int nrParcariPartiale = 1;
     while (parcare.ParcarePrecedenta != null)
     {
         parcare = parcare.ParcarePrecedenta;
         parcariPartiale.Add(parcare);
         nrParcariPartiale++;
     }
     return new RezultatCautare(parcariPartiale, nrParcariPartiale);
 }
        /// <summary>
        /// Reprezinta functia de cautare a caii spre iesire din parcare. Implementeaza algorimul A*.
        /// </summary>
        /// <param name="parcareInitiala">Reprezinta configuratia initiala a parcarii de la care se va incepe cautarea iesirii din parcare.</param>
        /// <returns>Intoarce un obiect ce va contine parcarile partiale si numarula acestora, care vor fi scrise in fisier.</returns>
        public RezultatCautare cautare(Parcare parcareInitiala)
        {
            int expandate = 1;
            Set open = new Set();
            List<Parcare> closed = new List<Parcare>();
            parcareInitiala.GScor = 0;
            parcareInitiala.HScor = euristica.distantaPanaLaIesire(parcareInitiala);
            open.Add(parcareInitiala);

            Parcare parcareBest = null;

            while (open.sortedList.Count != 0)
            {
                parcareBest = open.sortedList.ElementAt(0);
                if (parcareBest.SfarsitJoc)
                {
                    Console.WriteLine(expandate);
                    return refacereTraseu(parcareBest);
                }
                open.sortedList.Remove(parcareBest);
                closed.Add(parcareBest);
                List<Mutare> mutari = parcareBest.mutariPosibile();
                foreach (Mutare mutare in mutari)
                {
                    expandate++;
                    Parcare parcareNoua = parcareBest.aplicaMutare(mutare);
                    int gScorParcareNoua = parcareBest.GScor + 1;
                    int hScorParcareNoua = euristica.distantaPanaLaIesire(parcareNoua);
                    if (!contains(open.sortedList, parcareNoua) && !contains(closed, parcareNoua))
                    {
                        parcareNoua.GScor = gScorParcareNoua;
                        parcareNoua.HScor = hScorParcareNoua;
                        open.Add(parcareNoua);
                    }
                    else
                    {
                        if (gScorParcareNoua < parcareNoua.GScor)
                        {
                            parcareNoua.GScor = gScorParcareNoua;
                            parcareNoua.HScor = hScorParcareNoua;
                            if (contains(closed, parcareNoua))
                            {
                                closed.Remove(parcareNoua);
                                open.Add(parcareNoua);
                            }
                        }
                    }
                }
            }
            return new RezultatCautare();
        }
 private bool contains(Dictionary<Parcare, int> parcariCunoscute, Parcare parcareNoua, out int index)
 {
     for (int i = 0; i < parcariCunoscute.Keys.Count; i++)
     {
         Parcare parcare = parcariCunoscute.Keys.ElementAt(i);
         if (parcare.Equals(parcareNoua))
         {
             index = i;
             return true;
         }
     }
     index = -1;
     return false;
 }
Esempio n. 8
0
 /// <summary>
 /// Metoda ce adauga elemente in lista astfel incat aceasta sa ramana sortata. Asta se realizeaza printr-o cautare binara, metoda ce este implementata in framework.
 /// </summary>
 /// <param name="parcare">Parcare ce va fi adaugata in lista sortata.</param>
 public void Add(Parcare parcare)
 {
     if (sortedList.Count == 0)
     {
         sortedList.Add(parcare);
         return;
     }
     int maxScor = sortedList[sortedList.Count - 1].GScor + sortedList[sortedList.Count - 1].HScor;
     if (maxScor <= parcare.GScor + parcare.HScor)
     {
         sortedList.Add(parcare);
         return;
     }
     int index = sortedList.BinarySearch(parcare);
     sortedList.Insert(Math.Abs(~index), parcare);
 }
Esempio n. 9
0
        public async Task <ActionResult> Edit([Bind(Include = "Nume, Locatie")] Parcare parcare)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    db.Entry(parcare).State = EntityState.Modified;
                    await db.SaveChangesAsync();

                    return(RedirectToAction("Index"));
                }
                return(View(parcare));
            }
            catch
            {
                return(View());
            }
        }
Esempio n. 10
0
        //Edit
        // GET: Parcare/Edit/5
        public async Task <ActionResult> Edit(int?id)
        {
            try
            {
                if (id == null)
                {
                    return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
                }
                Parcare parcare = await db.Parcare.FindAsync(id);

                if (parcare == null)
                {
                    return(HttpNotFound());
                }
                return(View(parcare));
            }
            catch (Exception e)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); // to do: redirect to error page
            }
        }
Esempio n. 11
0
        /* Am ales sa fac un meniu in clasa main folosind un switch pentru a facilita utilizarea si testarea aplicatiei.
         * Tot aici se creaza instanta parcarii.
         */
        static void Main(string[] args)
        {
            Parcare parcare = new Parcare();
            bool    running = true;
            // o expresie regulata pe care o folosesc pt a valida ca numarul de inmatriculare sa fie de forma "JD-NR-ABC"
            var validation = new Regex("^[A-Z][A-Z]-\\d\\d-[A-Z][A-Z][A-Z]$");

            while (running)
            {
                Console.Clear();
                Console.WriteLine("1. Afisare numar locuri libere");
                Console.WriteLine("2. Intra in parcare");
                Console.WriteLine("3. Iesire din parcare");
                Console.WriteLine("4. Afisare lista masini parcate");
                Console.WriteLine("0. Exit\n");

                Console.WriteLine("Introduceti optiunea:");
                string menu = Console.ReadLine();
                Console.Clear();

                switch (menu)
                {
                case "1":
                    Console.WriteLine("In acest moment in parcare sunt {0} locuri disponibile", parcare.GetNrLocuriLibere());
                    Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                    Console.ReadKey();
                    break;

                case "2":
                    /*in acest for este construit desenul pentru locurile de parcare. Pe randul 2 si 5 in fiecare loc de parcare
                     * este ori X daca locul e ocupat ori un numar reprezentand locul de parcare.*/
                    for (int i = 0; i < 30; i++)
                    {
                        if (i % 5 == 0 && i != 0)
                        {
                            Console.Write("|\n");
                        }
                        if (i == 15)
                        {
                            Console.WriteLine("-------------------------------");
                        }
                        if (i >= 5 && i <= 9)
                        {
                            (int index, Masina masina)car = parcare.GetListaMasini().Find(m => m.Item1 == i % 5 + 1);
                            if (car.masina == null)
                            {
                                Console.Write("|  {0}  ", i % 5 + 1);
                            }
                            else
                            {
                                Console.Write("|  X  ");
                            }
                        }
                        else if (i >= 20 && i <= 24)
                        {
                            (int index, Masina masina)car = parcare.GetListaMasini().Find(m => m.Item1 == i % 5 + 6);
                            if (car.masina == null)
                            {
                                if (i % 5 + 6 == 10)
                                {
                                    Console.Write("|  {0} ", i % 5 + 6);
                                }
                                else
                                {
                                    Console.Write("|  {0}  ", i % 5 + 6);
                                }
                            }
                            else
                            {
                                Console.Write("|  X  ");
                            }
                        }
                        else
                        {
                            Console.Write("|     ");
                        }
                        if (i == 29)
                        {
                            Console.WriteLine("|\n");
                        }
                    }

                    Console.WriteLine("X - loc ocupat\n");

                    Console.WriteLine("Pe ce loc doriti sa parcati ?");
                    string locAles = Console.ReadLine();
                    int    value;

                    //verific daca locul de parcare tastat este in limite
                    while (!int.TryParse(locAles, out value) || int.Parse(locAles) < 1 || int.Parse(locAles) > 10)
                    {
                        Console.WriteLine("Loc incorect!");
                        Console.WriteLine("Introduceti un numar intre 1-10 inclusiv");
                        locAles = Console.ReadLine();
                    }

                    Console.WriteLine("Introduceti numarul de inmatriculare sub forma 'JJ-NR-ABC':");
                    string numarIntrare = Console.ReadLine();

                    //validez daca nr de inmatriculare tastat este in format corect
                    while (!validation.IsMatch(numarIntrare))
                    {
                        Console.Clear();
                        Console.WriteLine("Numar incorect!");
                        Console.WriteLine("Introduceti numarul de inmatriculare sub forma 'JJ-NR-ABC':");
                        numarIntrare = Console.ReadLine();
                    }

                    //incerc introducerea masinii in parcare, in caz contrar primesc o exceptie si afisez mesajul acesteia
                    try
                    {
                        parcare.Intrare(numarIntrare, Int32.Parse(locAles));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                        Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                        Console.ReadKey();
                        break;
                    }

                    Console.WriteLine("\nBun venit! Tariful pentru prima ora este de {0} LEI," +
                                      " iar pentru orice ora ulterioara este de {1} LEI/ora", parcare.GetTarifPrimaOra(), parcare.GetTarifUlterior());
                    Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                    Console.ReadKey();
                    break;

                case "3":
                    Console.WriteLine("Introduceti numarul de inmatriculare sub forma 'JJ-NR-ABC':");
                    string numarIesire = Console.ReadLine();

                    while (!validation.IsMatch(numarIesire))
                    {
                        Console.Clear();
                        Console.WriteLine("Numar incorect!");
                        Console.WriteLine("Introduceti numarul de inmatriculare sub forma 'JJ-NR-ABC':");
                        numarIesire = Console.ReadLine();
                    }
                    try
                    {
                        parcare.Iesire(numarIesire);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }

                    Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                    Console.ReadKey();
                    break;

                case "4":
                    if (parcare.GetListaMasini().Count == 0)
                    {
                        Console.WriteLine("Nu sunt masini parcate in acest moment");
                        Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                        Console.ReadKey();
                        break;
                    }

                    Console.WriteLine("Masinile parcate in acest moment sunt:");
                    foreach ((int index, Masina masina)loc in parcare.GetListaMasini())
                    {
                        Console.WriteLine("{0} pe locul {1}", loc.masina.NrInmatriculare, loc.index);
                    }

                    Console.WriteLine("\nApasati orice tasta pentru a va reintoarce la meniu");
                    Console.ReadKey();
                    break;

                case "0":
                    running = false;
                    break;

                default:
                    Console.WriteLine("Comanda invalida. Apasati orice tasta pentru a reveni la meniu");
                    Console.ReadKey();
                    break;
                }
            }
        }
Esempio n. 12
0
        private int masiniLibere(Parcare parcare)
        {
            int nrMasiniLibere = 0;
            foreach (Masina masina in parcare.Masini)
            {
                if(masina.TipMasina == TipMasinaEnum.MasinaOrizontala)
                {
                    if(parcare.OcupareParcare[masina.PozitieX, masina.PozitieY - 1] == false || parcare.OcupareParcare[masina.PozitieX, masina.PozitieY + masina.Lungime] == false)
                    {
                        nrMasiniLibere++;
                    }
                }

                else if (masina.TipMasina == TipMasinaEnum.MasinaVerticala)
                {
                    if (parcare.OcupareParcare[masina.PozitieX - 1, masina.PozitieY] == false || parcare.OcupareParcare[masina.PozitieX + masina.Lungime, masina.PozitieY] == false)
                    {
                        nrMasiniLibere++;
                    }
                }
            }
            return nrMasiniLibere;
        }
Esempio n. 13
0
 public ActionResult Create(Parcare parcare)
 {
     db.Parcare.Add(parcare);
     db.SaveChanges();
     return(View());
 }