A cool algorithm to check a Sudoku field?

前端 未结 25 746
清酒与你
清酒与你 2021-01-30 09:19

Does anyone know a simple algorithm to check if a Sudoku-Configuration is valid? The simplest algorithm I came up with is (for a board of size n) in Pseudocode

f         


        
相关标签:
25条回答
  • 2021-01-30 10:14

    Here's a very concise version in Swift, that only uses an array of Ints to track the groups of 9 numbers, and only iterates over the sudoku once.

    import UIKit
    
    func check(_ sudoku:[[Int]]) -> Bool {
    
        var groups = Array(repeating: 0, count: 27)
    
        for x in 0...8 {
            for y in 0...8 {
                groups[x] += 1 << sudoku[x][y] // Column (group 0 - 8)
                groups[y + 9] += 1 << sudoku[x][y] // Row (group 9 - 17)
                groups[(x + y * 9) / 9 + 18] += 1 << sudoku[x][y] // Box (group 18 - 27)
            }
        }
    
        return groups.filter{ $0 != 1022 }.count == 0
    }
    
    let sudoku = [
        [7, 5, 1,  8, 4, 3,  9, 2, 6],
        [8, 9, 3,  6, 2, 5,  1, 7, 4],
        [6, 4, 2,  1, 7, 9,  5, 8, 3],
        [4, 2, 5,  3, 1, 6,  7, 9, 8],
        [1, 7, 6,  9, 8, 2,  3, 4, 5],
        [9, 3, 8,  7, 5, 4,  6, 1, 2],
        [3, 6, 4,  2, 9, 7,  8, 5, 1],
        [2, 8, 9,  5, 3, 1,  4, 6, 7],
        [5, 1, 7,  4, 6, 8,  2, 3, 9]
    ]
    
    if check(sudoku) {
        print("Pass")
    } else {
        print("Fail")
    }
    
    0 讨论(0)
提交回复
热议问题