36.go 1.9 KB

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