commit
3444cae838
@ -0,0 +1,62 @@
|
||||
package sudokuSolver
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math"
|
||||
)
|
||||
|
||||
func isValid(grid [][]int, x, y, i int) bool {
|
||||
for n := 0; n < 9; n++ {
|
||||
if grid[y][n] == i || grid[n][x] == i{
|
||||
return false
|
||||
}
|
||||
}
|
||||
topX, topY := int(3 * (math.Floor(float64(x/3)))), int(3 * (math.Floor(float64(y/3))))
|
||||
for x := topX; x < topX + 3; x++ {
|
||||
for y := topY; y < topY + 3; y++ {
|
||||
if grid[y][x] == i {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func findNextEmptyCell(grid [][]int) (int,int) {
|
||||
for y := 0; y < 9; y++ {
|
||||
for x := 0; x < 9; x++ {
|
||||
if grid[y][x] == 0 {
|
||||
return x, y
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1, -1
|
||||
}
|
||||
|
||||
func SolveSudoku(grid [][]int, x, y int, ctx context.Context) bool {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return false
|
||||
default:
|
||||
}
|
||||
x, y = findNextEmptyCell(grid)
|
||||
if x == -1 && y == -1 {
|
||||
return true
|
||||
}
|
||||
for i := 1; i <= 9; i++ {
|
||||
if isValid(grid, x, y, i) {
|
||||
grid[y][x] = i
|
||||
if SolveSudoku(grid, x, y, ctx) {
|
||||
return true
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return false
|
||||
default:
|
||||
}
|
||||
grid[y][x] = 0
|
||||
}
|
||||
//time.Sleep(100000000)
|
||||
}
|
||||
return false
|
||||
}
|
||||
Loading…
Reference in new issue