using CzokoŚmieciarka.DataModels.Enums; using CzokoŚmieciarka.DataModels.Interfaces; using CzokoŚmieciarka.DataModels.Interfaces.GarbageCollector; using CzokoŚmieciarka.DataModels.Interfaces.TrashCans; using CzokoŚmieciarka.DataModels.Models; using CzokoŚmieciarka.DataModels.Models.Steps; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CzokoŚmieciarka.AI_Naive { public class DFS { public DFS() { } int count = 0; public List BestPath(AGarbageCollector collector, object[,] grid) { var r=Search(collector, grid, 0).Key; Console.WriteLine(count); return r; } List PossibleSteps(AGarbageCollector collector, object[,] grid) { var result = new List(); var moveSteps = new List() { new MoveStep(Direction.Up), new MoveStep(Direction.Down), new MoveStep(Direction.Left), new MoveStep(Direction.Right) }; var filteredMoveSteps = new List(); foreach (var item in moveSteps) { var copyCollector = (AGarbageCollector)collector.Clone(); var copyGrid = (object[,])grid.Clone(); try { item.Invoke(copyCollector, grid); var gcx = copyCollector.Coords.X; var gcy = copyCollector.Coords.Y; if (grid[gcx, gcy] is IRoad1 || grid[gcx, gcy] is IGarbageLocalization || grid[gcx, gcy] is ADump) { result.Add(item); } } catch (Exception e) { } } return result; } KeyValuePair, int> Search(AGarbageCollector collector, object[,] grid, int length) { count++; if (length > 40) return new KeyValuePair, int>(new List(), length); var possibleSteps = PossibleSteps(collector, grid); foreach (var item in possibleSteps) { var copyCollector = (AGarbageCollector)collector.Clone(); var copyGrid = (object[,])grid.Clone(); //if (copyGrid[copyCollector.Coords.X, copyCollector.Coords.Y] is IRoad1) copyGrid[copyCollector.Coords.X, copyCollector.Coords.Y] = new Road2(); item.Invoke(copyCollector, copyGrid); var s = Search(copyCollector, copyGrid, length + 1); if (s.Key != null) { s.Key.Insert(0, item); return s; } } return new KeyValuePair, int>(null, length); /*var min = int.MaxValue; var min_index = 0; for (int i = 0; i < mapped.Count; i++) { if (mapped.ElementAt(i).Value <= min) { min = mapped.ElementAt(i).Value; min_index = i; } } return mapped.ElementAt(min_index); */ } } }