Exemplo n.º 1
0
 public void SetSpot(ThreeCoord coord, int valToSet)
 {
     if (coord.Level < 0 || coord.Level > 2 || coord.Y >= MaxY || coord.Y < 0 || coord.X >= MaxX || coord.X < 0)
     {
         return;
     }
     spots[coord.Level, coord.X, coord.Y] = valToSet;
 }
Exemplo n.º 2
0
 public int GetSpot(ThreeCoord coord)
 {
     if (coord.Level < 0 || coord.Level > 2 || coord.Y >= MaxY || coord.Y < 0 || coord.X >= MaxX || coord.X < 0)
     {
         return(-1);
     }
     return(spots[coord.Level, coord.X, coord.Y]);
 }
Exemplo n.º 3
0
            public int GetShortestSteps()
            {
                var start = new ThreeCoord(1, 0, 0);
                var end   = new ThreeCoord(1, TargetX, TargetY);

                // Walk around until we reach the end, then keep exploring until we find a shorter path, or we run out of paths.
                var coordsToCheck = new List <ThreeCoord>();

                coordsToCheck.Add(start);
                SetSpot(start, 0);
                while (coordsToCheck.Any())
                {
                    var best = GetSpot(end);

                    // Grab the closest coordinate.
                    //var coord = coordsToCheck.OrderBy(x => (x.Level == end.Level ? 0 : 7) + Math.Abs(x.X - end.X) + Math.Abs(x.Y - end.Y)).First();
                    var coord = coordsToCheck.First();
                    coordsToCheck.Remove(coord);
                    var currScore = GetSpot(coord);

                    if (currScore > best)
                    {
                        continue;
                    }

                    var currCoord      = new ThreeCoord(coord.Level, coord.X, coord.Y + 1);
                    var currCoordScore = GetSpot(currCoord);
                    if (currCoordScore > currScore + 1)
                    {
                        SetSpot(currCoord, currScore + 1);
                        if (!coordsToCheck.Contains(currCoord))
                        {
                            coordsToCheck.Add(currCoord);
                        }
                    }

                    currCoord      = new ThreeCoord(coord.Level, coord.X, coord.Y - 1);
                    currCoordScore = GetSpot(currCoord);
                    if (currCoordScore > currScore + 1)
                    {
                        SetSpot(currCoord, currScore + 1);
                        if (!coordsToCheck.Contains(currCoord))
                        {
                            coordsToCheck.Add(currCoord);
                        }
                    }

                    currCoord      = new ThreeCoord(coord.Level, coord.X + 1, coord.Y);
                    currCoordScore = GetSpot(currCoord);
                    if (currCoordScore > currScore + 1)
                    {
                        SetSpot(currCoord, currScore + 1);
                        if (!coordsToCheck.Contains(currCoord))
                        {
                            coordsToCheck.Add(currCoord);
                        }
                    }

                    currCoord      = new ThreeCoord(coord.Level, coord.X - 1, coord.Y);
                    currCoordScore = GetSpot(currCoord);
                    if (currCoordScore > currScore + 1)
                    {
                        SetSpot(currCoord, currScore + 1);
                        if (!coordsToCheck.Contains(currCoord))
                        {
                            coordsToCheck.Add(currCoord);
                        }
                    }

                    for (var levelToCheck = 0; levelToCheck < 3; levelToCheck++)
                    {
                        if (coord.Level != levelToCheck)
                        {
                            currCoord      = new ThreeCoord(levelToCheck, coord.X, coord.Y);
                            currCoordScore = GetSpot(currCoord);
                            if (currCoordScore > currScore + 7)
                            {
                                SetSpot(currCoord, currScore + 7);
                                if (!coordsToCheck.Contains(currCoord))
                                {
                                    coordsToCheck.Add(currCoord);
                                }
                            }
                        }
                    }
                }

                /*
                 * // Now, let's check the cave.  If there's any unvisited square that's not 1 or 7 points away, then we failed somewhere.
                 * var visited = new HashSet<ThreeCoord>();
                 * var unvisited = new HashSet<ThreeCoord>();
                 * unvisited.Add(start);
                 * while(unvisited.Any())
                 * {
                 *  var coord = unvisited.First();
                 *  unvisited.Remove(coord);
                 *  var coordScore = GetSpot(coord);
                 *
                 *  var currCoord = new ThreeCoord(coord.Level, coord.X, coord.Y + 1);
                 *  var currCoordScore = GetSpot(currCoord);
                 *  if (currCoordScore != -1)
                 *  {
                 *      if (!visited.Contains(currCoord))
                 *      {
                 *          if (currCoordScore != coordScore + 1)
                 *          {
                 *              Console.WriteLine($"Problem walking from {coord} ({coordScore}) to {currCoord} ({currCoordScore}).");
                 *          }
                 *      }
                 *      if (!unvisited.Contains(currCoord)) unvisited.Add(currCoord);
                 *  }
                 *
                 * }
                 */

                return(GetSpot(end));
            }