-
Notifications
You must be signed in to change notification settings - Fork 120
/
Copy path037-SudokuSolver.cs
60 lines (51 loc) · 2.03 KB
/
037-SudokuSolver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//-----------------------------------------------------------------------------
// Runtime: 168ms
// Memory Usage:
// Link:
//-----------------------------------------------------------------------------
namespace LeetCode
{
public class _037_SudokuSolver
{
bool[,] colUsed = new bool[9, 9];
bool[,] rowUsed = new bool[9, 9];
bool[,] squareUsed = new bool[9, 9];
public void SolveSudoku(char[,] board)
{
int row, column, squareId, value;
for (row = 0; row < 9; row++)
{
for (column = 0; column < 9; column++)
{
value = board[row, column] - '0' - 1;
if (value > 8 || value < 0) { continue; }
squareId = (row / 3) * 3 + column / 3;
if (colUsed[column, value] || rowUsed[row, value] || squareUsed[squareId, value]) { return; }
colUsed[column, value] = rowUsed[row, value] = squareUsed[squareId, value] = true;
}
}
RecursiveSolver(board, 0, 0);
}
bool RecursiveSolver(char[,] boarder, int row, int col)
{
if (row == 9) { return true; }
if (col == 9) { return RecursiveSolver(boarder, row + 1, 0); }
if (boarder[row, col] != '.') { return RecursiveSolver(boarder, row, col + 1); }
int squareId;
for (int i = 0; i < 9; i++)
{
squareId = (row / 3) * 3 + col / 3;
if (colUsed[col, i] || rowUsed[row, i] || squareUsed[squareId, i]) { continue; }
boarder[row, col] = (char)('1' + i);
colUsed[col, i] = rowUsed[row, i] = squareUsed[squareId, i] = true;
if (RecursiveSolver(boarder, row, col + 1))
{
return true;
}
boarder[row, col] = '.';
colUsed[col, i] = rowUsed[row, i] = squareUsed[squareId, i] = false;
}
return false;
}
}
}