public static SudokuCell BaseCellToBruteForceCell(SudokuCell cell)
        {
            if (cell == null)
            {
                return(null);
            }
            if (cell is BruteForceAlgoCell)
            {
                return((BruteForceAlgoCell)cell);
            }

            BruteForceAlgoCell retCell = null;

            if (cell.Value != 0)
            {
                retCell = new BruteForceAlgoCell(cell.Value);
                // se il valore è stato definito, non serve propagare gli AllowableValues.
            }
            else
            {
                retCell = new BruteForceAlgoCell();

                // propago eventuali AllowableValues. Questo ottimizza il lavoro dell'algoritmo BruteForce.
                if (cell is LogicalBasedAlgoCell)
                {
                    retCell.AllowableValues = new List <int>(((LogicalBasedAlgoCell)cell).AllowableValues);
                }
            }

            return(retCell);
        }
Example #2
0
        private bool solveGameRecursively(SudokuGame game, List <BruteForceAlgoCell> bfCellList, int listIndex)
        {
            if (bfCellList != null && bfCellList.Count > listIndex)
            {
                BruteForceAlgoCell currentCell = bfCellList[listIndex];
                foreach (int tempValue in currentCell.AllowableValues)
                {
                    currentCell.TempValue = tempValue;

                    // se il valore scelto non è ammissibile, provo con il successivo
                    if (!game.isValid())
                    {
                        continue;
                    }

                    bool solvedGame = true;
                    if (bfCellList.Count > (listIndex + 1))
                    {
                        solvedGame = solveGameRecursively(game, bfCellList, listIndex + 1);
                    }
                    // se il gioco è valido, la soluzione è stata raggiunta
                    if (game.isValid() && solvedGame)
                    {
                        return(true);
                    }
                }
                // se nessun valore ha dato esito positivo, ripristino il valore nullo
                currentCell.TempValue = 0;
            }

            // spazzate tutte le combinazioni, nessuna soluzione trovata
            return(false);
        }