A cool algorithm to check a Sudoku field?

前端 未结 25 796
清酒与你
清酒与你 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:00

    array = [1,2,3,4,5,6,7,8,9]  
    sudoku = int [][]
    puzzle = 9 #9x9
    columns = map []
    units = map [] # box    
    unit_l = 3 # box width/height
    check_puzzle()    
    
    
    def strike_numbers(line, line_num, columns, units, unit_l):
        count = 0
        for n in line:
            # check which unit we're in
            unit = ceil(n / unit_l) + ceil(line_num / unit_l) # this line is wrong - rushed
            if units[unit].contains(n): #is n in unit already?
                 return columns, units, 1
            units[unit].add(n)
            if columns[count].contains(n): #is n in column already?
                return columns, units, 1
            columns[count].add(n)
            line.remove(n) #remove num from temp row
        return columns, units, line.length # was a number not eliminated?
    
    def check_puzzle(columns, sudoku, puzzle, array, units):
        for (i=0;i< puzzle;i++):
            columns, units, left_over = strike_numbers(sudoku[i], i, columns, units) # iterate through rows
            if (left_over > 0): return false
    

    Without thoroughly checking, off the top of my head, this should work (with a bit of debugging) while only looping twice. O(n^2) instead of O(3(n^2))

提交回复
热议问题