1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package main
- // 1 -> has this value
- var mDigit = map[byte]uint{
- '.': 0x000,
- '1': 0x100,
- '2': 0x080,
- '3': 0x040,
- '4': 0x020,
- '5': 0x010,
- '6': 0x008,
- '7': 0x004,
- '8': 0x002,
- '9': 0x001,
- }
- // if sudoku is solvable, return true
- func isValidSudokuOld(board [][]byte) bool {
- const ROW, COL, BLOCK = 0, 1, 2
- arr := [3][9]uint{}
- for i, row := range board {
- for j, v := range row {
- if arr[ROW][i]&mDigit[v] > 0 {
- return false
- }
- arr[ROW][i] |= mDigit[v]
- if arr[COL][j]&mDigit[v] > 0 {
- return false
- }
- arr[COL][j] |= mDigit[v]
- idx := i/3*3 + j/3
- if arr[BLOCK][idx]&mDigit[v] > 0 {
- return false
- }
- arr[BLOCK][idx] |= mDigit[v]
- }
- }
- for i, row := range board {
- for j, v := range row {
- mask := ^mDigit[v]
- flag := 0x1FF ^ (arr[ROW][i] & mask)
- flag &= 0x1FF ^ (arr[COL][j] & mask)
- idx := i/3*3 + j/3
- flag &= 0x1FF ^ (arr[BLOCK][idx] & mask)
- if flag == 0 {
- return false
- }
- }
- }
- return true
- }
- func isValidSudoku(board [][]byte) bool {
- const ROW, COL, BLOCK = 0, 1, 2
- arr := [3][9]uint{}
- for i, row := range board {
- for j, v := range row {
- if arr[ROW][i]&mDigit[v] > 0 {
- return false
- }
- arr[ROW][i] |= mDigit[v]
- if arr[COL][j]&mDigit[v] > 0 {
- return false
- }
- arr[COL][j] |= mDigit[v]
- idx := i/3*3 + j/3
- if arr[BLOCK][idx]&mDigit[v] > 0 {
- return false
- }
- arr[BLOCK][idx] |= mDigit[v]
- }
- }
- return true
- }
- /* func main() {
- b1 := [][]byte{
- {'.', '8', '7', '6', '5', '4', '3', '2', '1'},
- {'2', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'3', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'4', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'5', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'6', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'7', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'8', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'9', '.', '.', '.', '.', '.', '.', '.', '.'},
- }
- fmt.Println(isValidSudoku(b1))
- } */
|