示例#1
0
        public List <SmallSquare> GetAllPossibleSquares(List <SmallSquare> listOfSquares, int xPosition, int yPosition, HashSet <string> invalidFields, int smallSquareNumber)
        {
            int elementCounter = 0;

            if (listOfSquares.Count == 0)
            {
                listOfSquares.Add(this);
            }

            if (yPosition == 3)
            {
                System.Diagnostics.Debug.WriteLine("GetAllPossibleSquares return");

                Dictionary <string, SmallSquare> newList = new Dictionary <string, SmallSquare>();

                foreach (SmallSquare sq in listOfSquares)
                {
                    bool isOK = true;
                    if (smallSquareNumber < 6)
                    {
                        for (int y = 0; y < 3; y++)
                        {
                            for (int x = 0; x < 3; x++)
                            {
                                if (!sq.Fields[y, x].IsFixed)
                                {
                                    if (invalidFields.Contains(SudokuSolver.GetBlockListEntry(smallSquareNumber, sq.Fields[y, x].FieldValue, x, y)))
                                    {
                                        isOK = false;
                                        break;
                                    }
                                }

                                if (!isOK)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    if (isOK && sq.IsComplete())
                    {
                        if (!newList.ContainsKey(sq.GetKey()))
                        {
                            newList.Add(sq.GetKey(), sq);
                        }
                    }
                }

                if (!newList.Any())
                {
                    System.Diagnostics.Debug.WriteLine("no results");
                }

                return(newList.Select(val => val.Value).ToList());
            }

            Dictionary <string, SmallSquare> newSquares = new Dictionary <string, SmallSquare>();

            foreach (SmallSquare existingSquare in listOfSquares)
            {
                elementCounter = 0;

                for (int x = 0; x < 9; x++)
                {
                    SmallSquare   newSquare        = Program.DeepClone(existingSquare);
                    HashSet <int> availableNumbers = newSquare.GetNumbersStillAvailable();

                    if (newSquare.Fields[yPosition, xPosition].IsFixed == false)
                    {
                        newSquare.Fields[yPosition, xPosition].FieldValue = availableNumbers.ElementAt(elementCounter);
                        elementCounter++;
                    }

                    if (!newSquares.ContainsKey(newSquare.GetKey()))
                    {
                        newSquares.Add(newSquare.GetKey(), newSquare);
                    }


                    if (availableNumbers.Count() == elementCounter)
                    {
                        break;
                    }
                }
            }

            if (xPosition == 2)
            {
                xPosition = 0;
                yPosition++;
            }
            else
            {
                xPosition++;
            }

            return(GetAllPossibleSquares(newSquares.Select(val => val.Value).ToList(), xPosition, yPosition, invalidFields, smallSquareNumber));
        }