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");
        }
Пример #4
0
        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());
        }
Пример #6
0
        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();
        }