static void Main(string[] args) { // Initialise board Board b = new Board(); b.set(new int[,] { { 0,1,4, 2,0,0, 0,9,0}, { 0,2,0, 0,0,0, 0,0,3}, { 0,6,5, 0,8,0, 0,4,0}, { 0,0,8, 0,3,0, 0,0,0}, { 2,0,0, 5,0,7, 0,0,8}, { 0,0,0, 0,4,0, 6,0,0}, { 0,8,0, 0,2,0, 1,6,0}, { 4,0,0, 0,0,0, 0,5,0}, { 0,7,0, 0,0,5, 9,8,0} }); //b.set(new int[,] { // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0}, // { 0,0,0, 0,0,0, 0,0,0} }); //b.set(new int[,] //{ // { 0,6,1, 2,0,8, 3,0,9}, // { 0,0,0, 0,0,1, 4,0,2}, // { 0,0,2, 0,0,0, 6,0,0}, // { 6,2,0, 0,5,3, 0,0,4}, // { 5,0,0, 0,8,0, 0,0,6}, // { 1,0,0, 6,2,0, 0,7,3}, // { 0,0,4, 0,0,0, 7,0,0}, // { 8,0,6, 3,0,0, 0,0,0}, // { 3,0,5, 7,0,2, 9,6,0} //}); // Ask user for input string input = ""; int x = 0, y = 0, value = 0; string[] split; while (true) { Console.Clear(); b.render(); Console.WriteLine("Enter data in the format [x y value], or enter 0 to solve: "); input = Console.ReadLine(); split = input.Split(' '); if (split.Length == 3) { x = Int32.Parse(split[0]); y = Int32.Parse(split[1]); value = Int32.Parse(split[2]); b.set(x, y, value); } else if (input == "0") { break; } } // Attempt to solve sudoku Solver s = new Solver(b.copy()); Stopwatch watch = new Stopwatch(); watch.Start(); Board result = s.solve(); watch.Stop(); // Check complete if (result == null || !result.checkComplete()) { Console.WriteLine(":( Unable to solve."); } else { Console.Clear(); b.render(); Console.WriteLine("Solved! Time used " + watch.Elapsed.TotalMilliseconds + "ms. Here it is: "); result.render(); } }
Board s(int num, Board b) { if (num > 81 || b.checkComplete()) { return b; } for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (b.get(i, j) == 0) { for (int n = 1; n < 10; n++) { if (!existInRow(b, j, n) && !existInCol(b, i, n) && !existInZone(b, i, j, n)) { int[,] copy = (int[,])b.getArray().Clone(); b.set(i, j, n); Board tmp = s(num + 1, b); if (tmp != null) { return tmp; } else { b.set(copy); } } } return null; } } } return b; }