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)); }