/// <summary> /// Initializes an instance with the specified grid. /// </summary> /// <param name="grid">The grid.</param> public BugChecker(IReadOnlyGrid grid) { if (grid.IsValid(out _)) { (_emptyMap, _bivalueMap, _candMaps, _) = Grid = grid; } else { throw new ArgumentException( "The specified grid does not have a unique solution.", nameof(grid)); } }
/// <summary> /// To check if the puzzle is diamond or not. /// </summary> /// <param name="this">(<see langword="this"/> parameter) The puzzle to check.</param> /// <returns>A <see cref="bool"/> value indicating that.</returns> public static bool IsDiamond(this IReadOnlyGrid @this) { // Using a faster solver to check the grid is unique or not. if (@this.IsValid(out _)) { var result = new ManualSolver().Solve(@this); var(er, pr, dr) = (result.MaxDifficulty, result.PearlDifficulty, result.DiamondDifficulty); return(er == pr && er == dr); } else { // The puzzle does not have unique solution, neither pearl nor diamond one. return(false); } }
/// <summary> /// Search all backdoors whose level is lower or equals than the /// specified depth. /// </summary> /// <param name="grid">The grid.</param> /// <param name="depth"> /// The depth you want to search for. The depth value must be between 0 and 3. /// where value 0 is for searching for assignments. /// </param> /// <returns>All backdoors.</returns> /// <exception cref="SudokuRuntimeException"> /// Throws when the specified grid is invalid. /// </exception> public IEnumerable <IReadOnlyList <Conclusion> > SearchForBackdoors(IReadOnlyGrid grid, int depth) { if (depth < 0 || depth > 3) { return(Array.Empty <IReadOnlyList <Conclusion> >()); } if (!grid.IsValid(out _)) { throw new SudokuRuntimeException(); } var result = new List <IReadOnlyList <Conclusion> >(); for (int dep = 0; dep <= depth; dep++) { SearchForBackdoors(result, grid, dep); } return(result); }
/// <summary> /// To check whether the puzzle can be solved using only simple sudoku technique set. /// </summary> /// <param name="this">(<see langword="this"/> parameter) The puzzle.</param> /// <returns>A <see cref="bool"/> value indicating that.</returns> public static bool CanBeSolvedUsingOnlySsts(this IReadOnlyGrid @this) => @this.IsValid(out _) ? new ManualSolver().Solve(@this).DifficultyLevel <= DifficultyLevel.Advanced : false;