Ejemplo n.º 1
0
 public KnightSolutionEnumerator(ArrayListHashtable hatesMap, ArrayListHashtable needsMap, int knightsNumber)
 {
     this.hatesMap        = hatesMap;
     this.needsMap        = needsMap;
     this.KnightsNumber   = knightsNumber;
     this.PartialSolution = new KnightSolution(KnightsNumber);
 }
Ejemplo n.º 2
0
            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);
            }
Ejemplo n.º 3
0
            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);
            }
Ejemplo n.º 4
0
            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);
            }