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