Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
742
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.96 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Drawing;
  3. using Greedy.Architecture;
  4. using Greedy.Architecture.Drawing;
  5. using System.Linq;
  6.  
  7. namespace Greedy
  8. {
  9.     public class NotGreedyPathFinder : IPathFinder
  10.     {
  11.         private Dictionary<Point, Dictionary<Point, PathWithCost>> paths =
  12.             new Dictionary<Point, Dictionary<Point, PathWithCost>>();
  13.         private State fieldState;
  14.         private int maxTakenChests = 0;
  15.         private List<Point> bestPointPath = new List<Point>();
  16.  
  17.         private void CalculatePathsCost()
  18.         {
  19.             var pathFinder = new DijkstraPathFinder();
  20.             var points = new List<Point>(fieldState.Chests);
  21.             points.Add(fieldState.Position);
  22.             foreach (var point in points)
  23.             {
  24.                 if (!paths.ContainsKey(point))
  25.                     paths.Add(point, new Dictionary<Point, PathWithCost>());
  26.                 foreach (var path in pathFinder.GetPathsByDijkstra(fieldState, point, fieldState.Chests))
  27.                 {
  28.                     if (path.End != path.Start)
  29.                     {
  30.                         paths[path.Start][path.End] = path;
  31.                     }
  32.                 }
  33.             }
  34.         }
  35.  
  36.         private void FindPath(int energy, Point position, HashSet<Point> remainingChests,
  37.             int takenChests, List<Point> pointPath)
  38.         {
  39.             var newRemainingChests = new HashSet<Point>(remainingChests);
  40.             newRemainingChests.Remove(position);
  41.             foreach (var chest in newRemainingChests)
  42.                 if (paths[position][chest].Cost <= energy)
  43.                 {
  44.                     var newPath = new List<Point>(pointPath);
  45.                     newPath.Add(chest);
  46.                     FindPath(energy - paths[position][chest].Cost, chest, newRemainingChests,
  47.                         takenChests + 1, newPath);
  48.                 }
  49.             if (takenChests > maxTakenChests)
  50.             {
  51.                 bestPointPath = pointPath;
  52.                 maxTakenChests = takenChests;
  53.             }
  54.         }
  55.  
  56.         public List<Point> FindPathToCompleteGoal(State state)
  57.         {
  58.             fieldState = state;
  59.             CalculatePathsCost();
  60.             var pathFinder = new DijkstraPathFinder();
  61.             foreach (var path in paths[fieldState.Position])
  62.             {
  63.                 var remainingChests = new HashSet<Point>();
  64.                 foreach (var chest in paths[path.Key])
  65.                     remainingChests.Add(chest.Key);
  66.                 var pathPoints = new List<Point> { fieldState.Position, path.Key };
  67.                 FindPath(fieldState.Energy - path.Value.Cost, path.Key, remainingChests, 1, pathPoints);
  68.             }
  69.             var result = new List<Point>();
  70.             for (int i = 0; i < bestPointPath.Count - 1; ++i)
  71.                 result = result.Concat(paths[bestPointPath[i]][bestPointPath[i + 1]].Path.Skip(1)).ToList();
  72.             return result;
  73.         }
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement