85 lines
2.0 KiB
Swift
85 lines
2.0 KiB
Swift
import Foundation
|
|
|
|
var rowCheck: [[Bool]] = Array(repeating: Array(repeating: false, count: 10), count: 9)
|
|
var colCheck: [[Bool]] = Array(repeating: Array(repeating: false, count: 10), count: 9)
|
|
var squareCheck: [[Bool]] = Array(repeating: Array(repeating: false, count: 10), count: 9)
|
|
|
|
let squareArea = {(row: Int, col: Int) -> Int in
|
|
return (row/3)*3 + (col/3)
|
|
}
|
|
|
|
var board: [[Int]] = []
|
|
var emptyAxis: [(Int, Int)] = []
|
|
|
|
for row in 0..<9 {
|
|
if let input = readLine(),
|
|
let line = input.compactMap({Int(String($0))}) as? [Int],
|
|
line.count == 9
|
|
{
|
|
for col in 0..<9 {
|
|
let num = line[col]
|
|
|
|
if num != 0 {
|
|
let square = squareArea(row, col)
|
|
rowCheck[row][num] = true
|
|
colCheck[col][num] = true
|
|
squareCheck[square][num] = true
|
|
}
|
|
else {
|
|
emptyAxis.append((row, col))
|
|
}
|
|
}
|
|
|
|
board.append(line)
|
|
}
|
|
}
|
|
|
|
func isPossible(row: Int, col: Int, num: Int) -> Bool {
|
|
if rowCheck[row][num] {
|
|
return false
|
|
}
|
|
|
|
if colCheck[col][num] {
|
|
return false
|
|
}
|
|
|
|
if squareCheck[squareArea(row, col)][num] {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func backTracking(_ depth: Int) {
|
|
if depth == emptyAxis.count {
|
|
for row in board {
|
|
for num in row {
|
|
print(num, terminator: "")
|
|
}
|
|
print()
|
|
}
|
|
|
|
exit(0)
|
|
}
|
|
|
|
let (row, col) = emptyAxis[depth]
|
|
|
|
for num in 1...9 {
|
|
if isPossible(row: row, col: col, num: num) {
|
|
board[row][col] = num
|
|
rowCheck[row][num] = true
|
|
colCheck[col][num] = true
|
|
squareCheck[squareArea(row, col)][num] = true
|
|
|
|
backTracking(depth+1)
|
|
|
|
board[row][col] = 0
|
|
rowCheck[row][num] = false
|
|
colCheck[col][num] = false
|
|
squareCheck[squareArea(row, col)][num] = false
|
|
}
|
|
}
|
|
}
|
|
|
|
backTracking(0)
|