public void AddSolutionTest_NotUnique() { var result = new SudokuResult(); result.AddSolution(new int[1, 1]); result.AddSolution(new int[1, 1]); Assert.IsFalse(result.IsUnique); }
public void AddSolutionTest_HasSolution() { var result = new SudokuResult(); result.AddSolution(new int[1, 1]); Assert.IsTrue(result.HasSolution); }
private ISudokuResult RemovePossibleValue(int[,] data, ISudokuLevel level) { var notSuitableCells = new List <SudokuCell>(); while (_cellsForHiding.Count > 0) { var cell = _cellsForHiding.Dequeue(); if (notSuitableCells.Contains(cell)) { continue; } int value = data[cell.X, cell.Y]; data[cell.X, cell.Y] = 0; var result = _solver.Solve(data); if (result.HasUniqueSolution) { if (level.IsMatching(result)) { var generateResult = new SudokuResult { BackTrackCount = result.BackTrackCount, ComplexitiesScore = result.ComplexitiesScore }; generateResult.AddSolution(data); return(generateResult); } if (!level.IsMaxLimitExceeded(result)) { result = RemovePossibleValue(data, level); if (result != null) { return(result); } } } data[cell.X, cell.Y] = value; notSuitableCells.Add(cell); } foreach (var cell in notSuitableCells) { _cellsForHiding.Enqueue(cell); } return(null); }
private bool Solve(int[,] data, bool useRandom, SudokuResult result) { var keyValuesPair = FindNextCell(result); if (keyValuesPair == null) { var solveResult = new int[BlockCount, BlockCount]; Array.Copy(data, solveResult, BlockCount * BlockCount); result.AddSolution(solveResult); return(true); } result.BackTrackCount++; List <int> candidateList = useRandom ? keyValuesPair.Item2.OrderBy(a => Guid.NewGuid()).ToList() : keyValuesPair.Item2; foreach (int value in candidateList) { var cells = ApplyCandidate(keyValuesPair.Item1, value); if (ValidateIntegrity(cells)) { data[keyValuesPair.Item1.X, keyValuesPair.Item1.Y] = value; var values = new List <int>(_cellCandidatesDictionary[keyValuesPair.Item1]); _cellCandidatesDictionary[keyValuesPair.Item1].Clear(); if (Solve(data, useRandom, result) && !result.IsUnique) { return(true); } data[keyValuesPair.Item1.X, keyValuesPair.Item1.Y] = 0; _cellCandidatesDictionary[keyValuesPair.Item1].AddRange(values); } UndoApplyCandidate(cells, value); } return(false); }