36.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package main
  2. // 1 -> has this value
  3. var mDigit = map[byte]uint{
  4. '.': 0x000,
  5. '1': 0x100,
  6. '2': 0x080,
  7. '3': 0x040,
  8. '4': 0x020,
  9. '5': 0x010,
  10. '6': 0x008,
  11. '7': 0x004,
  12. '8': 0x002,
  13. '9': 0x001,
  14. }
  15. // if sudoku is solvable, return true
  16. func isValidSudokuOld(board [][]byte) bool {
  17. const ROW, COL, BLOCK = 0, 1, 2
  18. arr := [3][9]uint{}
  19. for i, row := range board {
  20. for j, v := range row {
  21. if arr[ROW][i]&mDigit[v] > 0 {
  22. return false
  23. }
  24. arr[ROW][i] |= mDigit[v]
  25. if arr[COL][j]&mDigit[v] > 0 {
  26. return false
  27. }
  28. arr[COL][j] |= mDigit[v]
  29. idx := i/3*3 + j/3
  30. if arr[BLOCK][idx]&mDigit[v] > 0 {
  31. return false
  32. }
  33. arr[BLOCK][idx] |= mDigit[v]
  34. }
  35. }
  36. for i, row := range board {
  37. for j, v := range row {
  38. mask := ^mDigit[v]
  39. flag := 0x1FF ^ (arr[ROW][i] & mask)
  40. flag &= 0x1FF ^ (arr[COL][j] & mask)
  41. idx := i/3*3 + j/3
  42. flag &= 0x1FF ^ (arr[BLOCK][idx] & mask)
  43. if flag == 0 {
  44. return false
  45. }
  46. }
  47. }
  48. return true
  49. }
  50. func isValidSudoku(board [][]byte) bool {
  51. const ROW, COL, BLOCK = 0, 1, 2
  52. arr := [3][9]uint{}
  53. for i, row := range board {
  54. for j, v := range row {
  55. if arr[ROW][i]&mDigit[v] > 0 {
  56. return false
  57. }
  58. arr[ROW][i] |= mDigit[v]
  59. if arr[COL][j]&mDigit[v] > 0 {
  60. return false
  61. }
  62. arr[COL][j] |= mDigit[v]
  63. idx := i/3*3 + j/3
  64. if arr[BLOCK][idx]&mDigit[v] > 0 {
  65. return false
  66. }
  67. arr[BLOCK][idx] |= mDigit[v]
  68. }
  69. }
  70. return true
  71. }
  72. /* func main() {
  73. b1 := [][]byte{
  74. {'.', '8', '7', '6', '5', '4', '3', '2', '1'},
  75. {'2', '.', '.', '.', '.', '.', '.', '.', '.'},
  76. {'3', '.', '.', '.', '.', '.', '.', '.', '.'},
  77. {'4', '.', '.', '.', '.', '.', '.', '.', '.'},
  78. {'5', '.', '.', '.', '.', '.', '.', '.', '.'},
  79. {'6', '.', '.', '.', '.', '.', '.', '.', '.'},
  80. {'7', '.', '.', '.', '.', '.', '.', '.', '.'},
  81. {'8', '.', '.', '.', '.', '.', '.', '.', '.'},
  82. {'9', '.', '.', '.', '.', '.', '.', '.', '.'},
  83. }
  84. fmt.Println(isValidSudoku(b1))
  85. } */