public KnightSolutionEnumerator(ArrayListHashtable hatesMap, ArrayListHashtable needsMap, int knightsNumber) { this.hatesMap = hatesMap; this.needsMap = needsMap; this.KnightsNumber = knightsNumber; this.PartialSolution = new KnightSolution(KnightsNumber); }
private bool IsConsistent(KnightSolution solution, int prevIndex, int index, int nextIndex) { // if (solution.ToString().IndexOf("acmnbhgediljfk") != -1) // //if (solution.ToString().IndexOf("anmckfjlideghb") != -1) // { // Console.WriteLine(); // } // get neighbors char knight = solution.Knights[index]; char prevNeighbor = ' '; char nextNeighbor = ' '; if (prevIndex >= 0) { prevNeighbor = solution.Knights[prevIndex]; } if (nextIndex >= 0) { nextNeighbor = solution.Knights[nextIndex]; } IList prevNeighborHatesList = hatesMap[prevNeighbor]; IList prevNeighborNeedsList = needsMap[prevNeighbor]; IList nextNeighborHatesList = hatesMap[nextNeighbor]; IList nextNeighborNeedsList = needsMap[nextNeighbor]; IList knightHatesList = hatesMap[knight]; IList knightNeedsList = needsMap[knight]; if ((knightHatesList != null && knightHatesList.Contains(prevNeighbor)) || (knightHatesList != null && knightHatesList.Contains(nextNeighbor)) || (prevNeighborHatesList != null && prevNeighborHatesList.Contains(knight)) || (nextNeighborHatesList != null && nextNeighborHatesList.Contains(knight))) { return(false); } if ((prevNeighbor != ' ') && nextNeighbor != ' ') { if (knightNeedsList != null && (!knightNeedsList.Contains(prevNeighbor) && !knightNeedsList.Contains(nextNeighbor))) { //Console.WriteLine(prevNeighbor + ":" + knight + ":" + nextNeighbor); //Console.Write(solution); return(false); } } return(true); }
public ISolution Clone() { KnightSolution clone = new KnightSolution(KnightsNumber); clone.Knights = new char[KnightsNumber]; for (int i = 0; i < KnightsNumber; i++) { clone.Knights[i] = Knights[i]; } clone.NextKnightIndex = NextKnightIndex; return(clone); }
public bool FillDescendantSolution(ISolution nextSolution) { KnightSolution solution = (KnightSolution)nextSolution; solution.NextKnightIndex = PartialSolution.NextKnightIndex + 1; solution.Knights = new char[KnightsNumber]; for (int i = 0; i < KnightsNumber; i++) { solution.Knights[i] = PartialSolution.Knights[i]; } for (; NextKnight < KnightsNumber; NextKnight++) { bool knightAlreadyPositioned = false; char newKnight = (char)('a' + NextKnight); for (int j = 0; j < PartialSolution.NextKnightIndex; j++) { // check if the knight already placed if (PartialSolution.Knights[j] == newKnight) { knightAlreadyPositioned = true; } } if (!knightAlreadyPositioned) { int index = PartialSolution.NextKnightIndex; solution.Knights[PartialSolution.NextKnightIndex] = newKnight; // check for previous if (index > 1 && !IsConsistent(solution, index - 2, index - 1, index)) { continue; } if (index == KnightsNumber - 1) { if (!IsConsistent(solution, index - 1, index, 0)) { continue; } if (!IsConsistent(solution, index, 0, 1)) { continue; } } else if (!IsConsistent(solution, index - 1, index, index + 1)) { continue; } NextKnight++; return(true); } } return(false); }