37.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package main
  2. // Slice ...
  3. type Slice []interface{}
  4. // Pop ...
  5. func (s *Slice) Pop() interface{} {
  6. l := len(*s)
  7. top := (*s)[l-1]
  8. *s = (*s)[:l-1]
  9. return top
  10. }
  11. // Empty ...
  12. func (s Slice) Empty() bool {
  13. return len(s) == 0
  14. }
  15. // Grid ...
  16. type Grid struct {
  17. X int
  18. Y int
  19. Val int
  20. }
  21. // SudokuMap ...
  22. type SudokuMap [][]int
  23. // NewSudokuMap ...
  24. func NewSudokuMap() (m SudokuMap) {
  25. m = make([][]int, 3) // 0 for col, 1 for row and 2 for block id
  26. for i := range m {
  27. m[i] = make([]int, 9)
  28. }
  29. return
  30. }
  31. var mask = [...]int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512}
  32. // Put ...
  33. func (m SudokuMap) Put(x, y, val int) {
  34. m[0][x] |= mask[val]
  35. m[1][y] |= mask[val]
  36. m[2][y/3*3+x/3] |= mask[val]
  37. }
  38. // Get ...
  39. func (m SudokuMap) Get(x, y, val int) bool {
  40. return (m[0][x]|m[1][y]|m[2][y/3*3+x/3])&mask[val] != 0
  41. }
  42. // Del ...
  43. func (m SudokuMap) Del(x, y, val int) {
  44. mask := mask[val] ^ 0x3FF
  45. m[0][x] &= mask
  46. m[1][y] &= mask
  47. m[2][y/3*3+x/3] &= mask
  48. }
  49. func solveSudoku(board [][]byte) {
  50. // Init sudoku and count blank grid
  51. m := NewSudokuMap()
  52. blank := 0
  53. for y := range board {
  54. for x := range board[y] {
  55. if board[y][x] == '.' {
  56. blank++
  57. } else {
  58. m.Put(x, y, int(board[y][x]-'0'))
  59. }
  60. }
  61. }
  62. var stack Slice = make([]interface{}, 0)
  63. for len(stack) != blank { // Assume that all quetion is solvable
  64. for y := 0; y < 9; y++ {
  65. for x, i := 0, 1; x < 9; x++ {
  66. if board[y][x] == '.' { // Never use 'copy' or 'range' when backtracking in golang!!!
  67. for ; i <= 9; i++ {
  68. if !m.Get(x, y, i) { // Is valid
  69. m.Put(x, y, i)
  70. stack = append(stack, Grid{x, y, i})
  71. i = 1 // Reset next val
  72. break
  73. }
  74. }
  75. if i == 10 { // Not valid
  76. top := stack.Pop().(Grid)
  77. m.Del(top.X, top.Y, top.Val)
  78. x, y, i = top.X-1, top.Y, top.Val+1 // Try next val of last step
  79. }
  80. }
  81. }
  82. }
  83. }
  84. for !stack.Empty() {
  85. top := stack.Pop().(Grid)
  86. board[top.Y][top.X] = byte(top.Val + '0')
  87. }
  88. }
  89. // func main() {
  90. // b1 := [][]byte{
  91. // {'5', '3', '.', '.', '7', '.', '.', '.', '.'},
  92. // {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
  93. // {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
  94. // {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
  95. // {'4', '.', '.', '8', '.', '3', '.', '.', '1'},
  96. // {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
  97. // {'.', '6', '.', '.', '.', '.', '2', '8', '.'},
  98. // {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
  99. // {'.', '.', '.', '.', '8', '.', '.', '7', '9'}}
  100. // solveSudoku(b1)
  101. // printBoard(b1)
  102. // println()
  103. // b2 := [][]byte{
  104. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  105. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  106. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  107. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  108. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  109. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  110. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  111. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
  112. // {'.', '.', '.', '.', '.', '.', '.', '.', '.'}}
  113. // solveSudoku(b2)
  114. // printBoard(b2)
  115. // }