using System.Collections.Generic;
public static int SudokuBlock = 3;
public static int SudokuSize = SudokuBlock * SudokuBlock;
public static bool Solved = false;
public static void Sudoku(char[][] board)
BacktrackHelper(ref board, 0, 0);
public static void BacktrackHelper(ref char[][] board, int row, int col)
if (board[row][col] == '.')
List<int> candidates = GetCandidates(board, row, col);
foreach (int digit in candidates)
if (board[row][col] == '.')
char candidate = (char)(digit + 48);
board[row][col] = candidate;
GoNextNumbers(ref board, row, col);
GoNextNumbers(ref board, row, col);
private static void GoNextNumbers(ref char[][] board, int row, int col)
if (row == SudokuSize - 1 && col == SudokuSize - 1)
if (col == SudokuSize - 1)
BacktrackHelper(ref board, row + 1, 0);
BacktrackHelper(ref board, row, col + 1);
public static List<int> GetCandidates(char[][] board, int row, int col)
var result = new List<int>();
var hashSet = new HashSet<int>();
for (int i = 0; i < SudokuSize; i++)
if (board[row][i] != '.')
int digit = board[row][i] - '0';
if (board[i][col] != '.')
int digit = board[i][col] - '0';
if (hashSet.Count == SudokuSize)
int cubeRow = SudokuBlock * (row / SudokuBlock);
int cubeCol = SudokuBlock * (col / SudokuBlock);
for (int r = cubeRow; r < cubeRow + SudokuBlock; r++)
for (int c = cubeCol; c < cubeCol + SudokuBlock; c++)
int digit = board[r][c] - '0';
for (int d = 1; d <= SudokuSize; d++)
if (!hashSet.Contains(d))
private static void DisplaySudoku(char[][] board)
for (int row = 0; row < SudokuSize; row++)
for (int col = 0; col < SudokuSize; col++)
if ((col + 1) % SudokuBlock == 0) colMargin = " ";
Console.Write(board[row][col].ToString() + colMargin);
if ((row + 1) % SudokuBlock == 0) rowMargin = "\n";
Console.WriteLine(rowMargin);
public static void SudokuTest()
Console.WriteLine("\nSudoku tests\n");
new char[] { '5','3','.','.','7','.','.','.','.' },
new char[] { '6','.','.','1','9','5','.','.','.' },
new char[] { '.','9','8','.','.','.','.','6','.' },
new char[] { '8','.','.','.','6','.','.','.','3' },
new char[] { '4','.','.','8','.','3','.','.','1' },
new char[] { '7','.','.','.','2','.','.','.','6' },
new char[] { '.','6','.','.','.','.','2','8','.' },
new char[] { '.','.','.','4','1','9','.','.','5' },
new char[] { '.','.','.','.','8','.','.','7','9' }
Console.WriteLine("---------------------\n");
new char[] { '5','.','.', '2','.','8', '.','.','1' },
new char[] { '.','.','.', '3','9','7', '.','.','.' },
new char[] { '.','.','3', '1','.','4', '8','.','.' },
new char[] { '3','7','1', '.','.','.', '6','8','9' },
new char[] { '.','5','.', '.','.','.', '.','7','.' },
new char[] { '8','9','6', '.','.','.', '5','2','4' },
new char[] { '.','.','4', '6','.','3', '9','.','.' },
new char[] { '.','.','.', '5','1','2', '.','.','.' },
new char[] { '6','.','.', '8','.','9', '.','.','2' }
Console.WriteLine("---------------------\n");
public static void Main()
Console.WriteLine("UniLecs");