Я пытаюсь решить головоломку судоку в Go, используя рекурсивный алгоритм возврата. Я создал вспомогательные функции, которые проверяют, являются ли определенные строки, столбцы или блоки действительными (т.е. нет повторяющихся значений), а также функцию для распечатки текущего состояния. Я проверял все это много раз, поэтому я не думаю, что они являются причиной проблемы. Я создал следующую функцию, чтобы проверить, возможна ли потенциальная игровая доска.
func cellValid(gameBoard *[9][9]int, value int, y int, x int) bool {
oldVal := gameBoard[y-1][x-1]
gameBoard[y-1][x-1] = value
row := getRow(gameBoard, y)
col := getCol(gameBoard, x)
block := getBlock(gameBoard, x, y)
possible := unitValid(row) && unitValid(col) && unitValid(block)
gameBoard[y-1][x-1] = oldVal
return possible
}
Она вносит изменения в игровую доску, проверяет, возможна ли она, и сохраняет это значение в переменной. Он меняет доску обратно на то, что было, затем возвращает бул. Эта функция вызывается из следующей функции solveBoard.
func solveBoard(gameBoard *[9][9]int) {
for row := 1; row <= 9; row++ {
for col := 1; col <= 9; col++ {
if gameBoard[row-1][col-1] == 0 {
for value := 1; value <= 9; value++ {
if cellValid(gameBoard, value, row, col) {
gameBoard[row-1][col-1] = value
solveBoard(gameBoard)
gameBoard[row-1][col-1] = 0
}
}
return
}
}
}
printBoard(gameBoard)
return
}
После запуска файла я не получаю вывод.
func main() {
var gameBoard = [9][9]int{
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}}
solveBoard(&gameBoard)
}
Вот ссылка на go игровую площадку, содержащую все мой код Go Детская площадка
Следующее видео демонстрирует то, что я пытаюсь выполнить sh в python.
Computerphile Video
Решение головоломки: Решение головоломки