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; }
/// <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); }
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()); } }
//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 } }
/* 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; } } }
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; }
public ActionResult Create(Parcare parcare) { db.Parcare.Add(parcare); db.SaveChanges(); return(View()); }