public static void CheckCellForSingleOption(this Grid grid, int x, int y) { if (grid.GetCell(x, y).Solved) { return; } if (grid.GetCell(x, y).Options.Count == 1) { grid.SolveCell(x, y, grid.GetCell(x, y).Options[0]); grid.UpdateNeighbours(x, y); } }
public static void SearchColumnForSingleCandidates(this Grid grid) { for (int col = 0; col < grid.GridSize; col++) { for (int value = 1; value <= grid.GridSize; value++) { // that value already exists in the col if (Array.Exists(grid.GetColumn(col), element => element == value)) { continue; } int result = grid.CheckColForValueInOptions(col, value); if (result != -1) { grid.SolveCell(result, col, value); grid.UpdateNeighbours(result, col); } } } }
// 3. Searching for Single Candidates: Square // "is there a value in any square that is only possible in one location?" public static void SearchSquareForSingleCandidates(this Grid grid) { for (int s = 0; s < grid.GridSize; s++) { for (int value = 1; value <= grid.GridSize; value++) { // that value already exists in the col if (Array.Exists(grid.GetSquare(s), element => element == value)) { continue; } Tuple <int, int> result = grid.CheckSquareForValueInOptions(s, value); if (result.Item1 != -1 && result.Item2 != -1) { grid.SolveCell(result.Item1, result.Item2, value); grid.UpdateNeighbours(result.Item1, result.Item2); } } } }
// TODO: rename - doesnt make sense. Should be single responsibility public static void SearchRowForSingleCandidates(this Grid grid) { // 3. Searching for Single Candidates: ROW // "is there a value in any row that is only possible in one location?" for (int row = 0; row < grid.GridSize; row++) { for (int value = 1; value <= grid.GridSize; value++) { // that value already exists in the row if (Array.Exists(grid.GetRow(row), element => element == value)) { continue; } int result = grid.CheckRowForValueInOptions(row, value); if (result != -1) { grid.SolveCell(row, result, value); grid.UpdateNeighbours(row, result); } } } }