37.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. const (
  3. // ROW ...
  4. ROW = iota
  5. // COL ...
  6. COL
  7. // BLOCK ...
  8. BLOCK
  9. )
  10. // Grid ...
  11. type Grid struct {
  12. X int
  13. Y int
  14. Val int
  15. }
  16. // SudokuMap ...
  17. type SudokuMap [][]int
  18. func (m SudokuMap) put(area, id, num int) {
  19. m[area][id] |= 1 << uint(num)
  20. }
  21. func (m SudokuMap) del(area, id, num int) {
  22. m[area][id] &= (1 << uint(num)) ^ 0x1FF
  23. }
  24. func solveSudoku(board [][]byte) {
  25. var m SudokuMap
  26. m = make([][]int, 3)
  27. for i := range m {
  28. m[i] = make([]int, 9)
  29. }
  30. for y, row := range board {
  31. for x, col := range row {
  32. if col == '.' {
  33. continue
  34. }
  35. num := int(col - '0')
  36. m.put(ROW, y, num)
  37. m.put(COL, x, num)
  38. m.put(BLOCK, y/3*3+x/3, num)
  39. }
  40. }
  41. stack := make([]Grid, 0)
  42. for y, row := range board {
  43. for x, col := range row {
  44. if col != '.' {
  45. continue
  46. }
  47. occur := m[ROW][y] & m[COL][x] & m[BLOCK][y/3*3+x/3]
  48. bit := 1
  49. for i := 0; i < 9; i++ {
  50. if bit&occur == 0 { // Is valid
  51. stack = append(stack, Grid{x, y, 0})
  52. }
  53. }
  54. }
  55. }
  56. }
  57. func main() {
  58. b1 := [][]byte{
  59. {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
  60. {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
  61. {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
  62. {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
  63. {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
  64. {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
  65. {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
  66. {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
  67. {'.', '.', '.', '.', '8', '.', '.', '7', '9'}}
  68. solveSudoku(b1)
  69. printBoard(b1)
  70. }