In this article, we're going
to look at Sudoku puzzle and algorithms used for solving it.
The Sudoku Puzzle
Simply put, Sudoku is a combinatorial
number placement puzzle with 9 x 9 cell grid partially filled in with numbers
from 1 to 9. The goal is to fill remaining, blank fields with the rest of
numbers so that each row and column will have only one number of each kind.
What's more, every 3 x 3 subsection of
the grid can't have any number duplicated as well. The level of difficulty
naturally rises with the number of blank fields in each board.
Problem Board
8 . . . . . . . .
. . 3 6 . . . . .
. 7 . . 9 . 2 . .
. 5 . . . 7 . . .
. . . . 4 5 7 . .
. . . 1 . . . 3 .
. . 1 . . . . 6 8
. . 8 5 . . . 1 .
. 9 . . . . 4 . .
Solved Board
And, to spoil the solution quickly – the correctly solved puzzle
will give us the following result:
8 1 2 7 5 3 6 4 9
9 4 3 6 8 2 1 7 5
6 7 5 4 9 1 2 8 3
1 5 4 2 3 7 8 9 6
3 6 9 8 4 5 7 2 1
2 8 7 1 6 9 5 3 4
5 2 1 9 7 4 3 6 8
4 3 8 5 2 6 9 1 7
7 9 6 3 1 8 4 5 2
C# code
static void Main(string[] args) { var
sudoku = new char[,] { { '8', '.', '.', '.', '.', '.', '.', '.', '.' }, { '.', '.', '3', '6', '.', '.', '.', '.', '.' }, { '.', '7', '.', '.', '9', '.', '2', '.', '.' }, { '.', '5', '.', '.', '.', '7', '.', '.', '.' }, { '.', '.', '.', '.', '4', '5', '7', '.', '.' }, { '.', '.', '.', '1', '.', '.', '.', '3', '.' }, { '.', '.', '1', '.', '.', '.', '.', '6', '8' }, { '.', '.', '8', '5', '.', '.', '.', '1', '.' }, { '.', '9', '.', '.', '.', '.', '4', '.', '.' } };
solveSudoku(sudoku);
Console.ReadLine(); }
public static void
solveSudoku(char[,] sudokuBoard) { if
(sudokuBoard == null || sudokuBoard.Length == 0) return;
Problemsolver(sudokuBoard); } private static bool
Problemsolver(char[,] sudokuBoard) { for (int i =
0; i < sudokuBoard.GetLength(0); i++) { for (int j =
0; j < sudokuBoard.GetLength(1); j++) {
if
(sudokuBoard[i, j] == '.') { for (char c =
'1'; c <= '9'; c++) {
if (isValid(sudokuBoard, i, j, c))
{
sudokuBoard[i, j] = c;
if (Problemsolver(sudokuBoard)) return true;
else
sudokuBoard[i, j] = '.'; } } return false; } } } for (int i =
0; i < sudokuBoard.GetLength(0); i++) { for (int j =
0; j < sudokuBoard.GetLength(1); j++) {
Console.Write(sudokuBoard[i, j] + " "); }
Console.Write(Environment.NewLine); }
return true; } private static bool
isValid(char[,] board, int row, int
col, char c) { for (int i =
0; i < 9; i++) { //check
row if
(board[i, col] != '.' && board[i, col] == c) return false; //check column if
(board[row, i] != '.' && board[row, i] == c) return false; //check
3*3 block if
(board[3 * (row / 3) + i / 3, 3 * (col / 3) + i % 3] != '.'
&& board[3 * (row / 3) + i / 3, 3 * (col / 3) + i % 3] == c) return false; } return true; } |
Output
2 comments
Write commentseasy to understand, good job cheers!
ReplyIt's really nice.
ReplyEmoticonEmoticon