示例#1
0
文件: Day23.cs 项目: gribovod1/AOC
 private bool coordIsOccuped(AmphipodState state, Point c)
 {
     foreach (var amphipodCoord in state.Coord) // Нельзя останавливаться там, где кто-то уже стоит
     {
         if (amphipodCoord == c)
         {
             return(true);
         }
     }
     return(false);
 }
示例#2
0
文件: Day23.cs 项目: gribovod1/AOC
        private Dictionary <KeyValuePair <Point, Point>, List <Point> > AllWays; // Словарь с координатами для кратчайшего пути

        public List <AmphipodState> getVariants(AmphipodState state)
        {
            var result = new List <AmphipodState>();

            for (var i = 0; i < state.Coord.Length; ++i)
            {
                var steps = GetAmphipodSteps(state, i);
                foreach (var se in steps)
                {
                    var newState = new AmphipodState(state.Energy + se.Key, state.Coord);
                    newState.Coord[i] = se.Value;
                    result.Add(newState);
                }
            }
            return(result);
        }
示例#3
0
文件: Day23.cs 项目: gribovod1/AOC
        private List <KeyValuePair <int, Point> > GetAmphipodSteps(AmphipodState state, int index)
        {
            List <KeyValuePair <int, Point> > result = new List <KeyValuePair <int, Point> >();

            for (var i = 0; i < CaveSize; ++i)
            {
                var coord     = FreeCoords[i];
                int stepCount = stepsToCoord(state, index, coord);
                if (stepCount > 0)
                {
                    var energyByStep = (int)Math.Pow(10, (index / 2 + 1));
                    result.Add(new KeyValuePair <int, Point>(stepCount * energyByStep, coord));
                }
            }
            return(result);
        }
示例#4
0
文件: Day23.cs 项目: gribovod1/AOC
        private int stepsToCoord(AmphipodState state, int index, Point coord)
        {
            if (ForbiddenPoints.Contains(coord)) // Нельзя останавливаться перед комнатами
            {
                return(0);
            }
            var          currentCoord = state.Coord[index];
            List <Point> coordlist    = AllWays[new KeyValuePair <Point, Point>(currentCoord, coord)];

            foreach (var c in coordlist)
            {
                if (coordIsOccuped(state, c))
                {
                    return(0);
                }
            }
            return(coordlist.Count - 1);
        }
示例#5
0
文件: Day23.cs 项目: gribovod1/AOC
 public bool isEndState(AmphipodState state)
 {
     if (!RoomPoints[0].Contains(state.Coord[0]))
     {
         return(false);
     }
     if (!RoomPoints[0].Contains(state.Coord[1]))
     {
         return(false);
     }
     if (!RoomPoints[1].Contains(state.Coord[2]))
     {
         return(false);
     }
     if (!RoomPoints[1].Contains(state.Coord[3]))
     {
         return(false);
     }
     if (!RoomPoints[2].Contains(state.Coord[4]))
     {
         return(false);
     }
     if (!RoomPoints[2].Contains(state.Coord[5]))
     {
         return(false);
     }
     if (!RoomPoints[3].Contains(state.Coord[6]))
     {
         return(false);
     }
     if (!RoomPoints[3].Contains(state.Coord[7]))
     {
         return(false);
     }
     return(true);
 }