private void SolveButton_Click(object sender, EventArgs e) { var groupedByRow = NumericUpDownControls .Select(n => TilesTableLayoutPanel.GetCellPosition(n)) .OrderBy(p => p.Row) .ThenBy(p => p.Column) .GroupBy(p => p.Row); string[] tileDefinitions = groupedByRow.Select(g => new string( g.Select(p => { NumericUpDown n = (NumericUpDown)TilesTableLayoutPanel.GetControlFromPosition(p.Column, p.Row); return(n.Value == 0 ? '.' : n.Value.ToString().Single()); }).ToArray() )).ToArray(); SudokuBoard board = SudokuFactory.ClassicWith3x3Boxes(tileDefinitions); // taking only 2 solutions for optimization IEnumerable <SudokuBoard> solutions = board.Solve().Take(2); if (!solutions.Any()) { MessageBox.Show("No solution available!"); return; } if (solutions.Count() > 1) { MessageBox.Show("Multiple solutions available!"); return; } string[] tileDefinion = solutions.Single().TileDefinitions; foreach (NumericUpDown numericUpDown in NumericUpDownControls) { var position = TilesTableLayoutPanel.GetCellPosition(numericUpDown); numericUpDown.Value = (int)char.GetNumericValue(tileDefinion[position.Row][position.Column]); } }
public void SudokoBoard_Solve_ClassicWithMultipleSolutions() { // Arrange SudokuBoard board = SudokuFactory.ClassicWith3x3Boxes(new[] { "...84...9", "..1.....5", "8...2.46.", // Removed a "1" on this line "7.8....9.", ".........", ".5....3.1", ".2491...7", "9.....5..", "3...84..." }); // Act IEnumerable <SudokuBoard> solutions = board.Solve(); // Assert Assert.Equal(20, solutions.Count()); }
public void SudokuBoard_Solve_ClassicWithSolution() { // Arrange SudokuBoard board = SudokuFactory.ClassicWith3x3Boxes(new[] { "...84...9", "..1.....5", "8...2146.", "7.8....9.", ".........", ".5....3.1", ".2491...7", "9.....5..", "3...84..." }); string[] tileDefinitions = new[] { "632845179", "471369285", "895721463", "748153692", "163492758", "259678341", "524916837", "986237514", "317584926", }; // Act IEnumerable <SudokuBoard> solutions = board.Solve(); // Assert Assert.Single(solutions); Assert.Equal(tileDefinitions, solutions.First().TileDefinitions); }