private bool coordIsOccuped(AmphipodState state, Point c) { foreach (var amphipodCoord in state.Coord) // Нельзя останавливаться там, где кто-то уже стоит { if (amphipodCoord == c) { return(true); } } return(false); }
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); }
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); }
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); }
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); }