public void ValidateRows_InputIsValid_ReturnTrue() { Sudoku sudoku = SudokuParser.FromString("600408000463900700090000503009006000002004380000003627940070030070080090310000206"); bool result = sudoku.ValidateRows(); Assert.IsTrue(result, "Sudoku rows should be valid"); }
public void IsValidState_InputIsInvalid_ReturnFalse() { Sudoku sudoku = SudokuParser.FromString("600408000403900700090000503009006000002044380000003627940070030070080090310000206"); bool result = sudoku.IsValidState(); Assert.IsFalse(result, "Sudoku should be invalid"); }
public void ValidateRegions_InputIsinvalid_ReturnFalse() { Sudoku sudoku = SudokuParser.FromString("600408000463900700090000503009006000002004380000003627940070030070080092310000206"); bool result = sudoku.ValidateRegions(); Assert.IsFalse(result, "Sudoku regions should be invalid"); }
public async Task SolveSudoku_InputIsUnsolvable_ReturnSolution() { Sudoku sudoku = SudokuParser.FromString("600408000403900700090000503009006000002044380000003627940070030070080090310000206"); BacktrackingSudokuSolver solver = new(); await solver.SolveSudokuAsync(sudoku); Assert.IsFalse(sudoku.IsSolved()); }
public async Task SolveSudoku_InputIsSolvable_ReturnSolution() { Sudoku sudoku = SudokuParser.FromString("600408000403900700090000503009006000002004380000003627940070030070080090310000206"); ConstraintPropagationSudokuSolver solver = new(); await solver.SolveSudokuAsync(sudoku); Assert.IsTrue(sudoku.IsSolved()); }
private static void Solve(List <string> boards, int maxSolutions, bool prettyPrint) { maxSolutions = Math.Abs(maxSolutions); var parser = new SudokuParser(); var solver = new SudokuSolver(); var boardsToSolve = new List <SolverResult>(); foreach (var b in boards) { byte[] rawBoard; if (!parser.TryParse9X9Board(b, out rawBoard)) { WriteLine($"Failed to parse {b}"); continue; } var board = solver.CreateBoard(rawBoard); boardsToSolve.Add(new SolverResult() { OriginalBoard = board }); } var sw = new Stopwatch(); WriteLine("Solving started..."); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); for (var i = 0; i < boardsToSolve.Count; ++i) { sw.Start(); boardsToSolve[i].SolutionList = solver.FindAllSolutions(boardsToSolve[i].OriginalBoard, maxSolutions); sw.Stop(); boardsToSolve[i].TotalDurationMs = sw.Elapsed.TotalMilliseconds; sw.Reset(); } var messages = new List <string>(); var totalSolutionCount = boardsToSolve.Aggregate(0, (total, item) => total + item.SolutionList.Count); var totalSolvingTime = boardsToSolve.Aggregate(0.0, (total, item) => total + item.TotalDurationMs); messages.Add($"Finding {totalSolutionCount} solution for {boardsToSolve.Count} boards took {totalSolvingTime}ms"); messages.Add($"Avg. solving time for single board is {totalSolvingTime / totalSolutionCount}ms"); var writer = new SudokuWriter(); boardsToSolve.ForEach(s => { messages.Add($"Solutions found in {s.TotalDurationMs}ms"); if (prettyPrint) { messages.Add(writer.GetPrettyStringRepresentation(s.OriginalBoard)); s.SolutionList.ForEach(b => messages.Add(writer.GetPrettyStringRepresentation(b))); } else { messages.Add(writer.GetStringRepresentation(s.OriginalBoard)); s.SolutionList.ForEach(b => messages.Add(writer.GetStringRepresentation(b))); } }); messages.ForEach(WriteLine); messages.Clear(); }