| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | package main// Slice ...type Slice []interface{}// Pop ...func (s *Slice) Pop() interface{} {	l := len(*s)	top := (*s)[l-1]	*s = (*s)[:l-1]	return top}// Empty ...func (s Slice) Empty() bool {	return len(s) == 0}// Grid ...type Grid struct {	X   int	Y   int	Val int}// SudokuMap ...type SudokuMap [][]int// NewSudokuMap ...func NewSudokuMap() (m SudokuMap) {	m = make([][]int, 3) // 0 for col, 1 for row and 2 for block id	for i := range m {		m[i] = make([]int, 9)	}	return}var mask = [...]int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512}// Put ...func (m SudokuMap) Put(x, y, val int) {	m[0][x] |= mask[val]	m[1][y] |= mask[val]	m[2][y/3*3+x/3] |= mask[val]}// Get ...func (m SudokuMap) Get(x, y, val int) bool {	return (m[0][x]|m[1][y]|m[2][y/3*3+x/3])&mask[val] != 0}// Del ...func (m SudokuMap) Del(x, y, val int) {	mask := mask[val] ^ 0x3FF	m[0][x] &= mask	m[1][y] &= mask	m[2][y/3*3+x/3] &= mask}func solveSudoku(board [][]byte) {	// Init sudoku and count blank grid	m := NewSudokuMap()	blank := 0	for y := range board {		for x := range board[y] {			if board[y][x] == '.' {				blank++			} else {				m.Put(x, y, int(board[y][x]-'0'))			}		}	}	var stack Slice = make([]interface{}, 0)	for len(stack) != blank { // Assume that all quetion is solvable		for y := 0; y < 9; y++ {			for x, i := 0, 1; x < 9; x++ {				if board[y][x] == '.' { // Never use 'copy' or 'range' when backtracking in golang!!!					for ; i <= 9; i++ {						if !m.Get(x, y, i) { // Is valid							m.Put(x, y, i)							stack = append(stack, Grid{x, y, i})							i = 1 // Reset next val							break						}					}					if i == 10 { // Not valid						top := stack.Pop().(Grid)						m.Del(top.X, top.Y, top.Val)						x, y, i = top.X-1, top.Y, top.Val+1 // Try next val of last step					}				}			}		}	}	for !stack.Empty() {		top := stack.Pop().(Grid)		board[top.Y][top.X] = byte(top.Val + '0')	}}// func main() {// 	b1 := [][]byte{// 		{'5', '3', '.', '.', '7', '.', '.', '.', '.'},// 		{'6', '.', '.', '1', '9', '5', '.', '.', '.'},// 		{'.', '9', '8', '.', '.', '.', '.', '6', '.'},// 		{'8', '.', '.', '.', '6', '.', '.', '.', '3'},// 		{'4', '.', '.', '8', '.', '3', '.', '.', '1'},// 		{'7', '.', '.', '.', '2', '.', '.', '.', '6'},// 		{'.', '6', '.', '.', '.', '.', '2', '8', '.'},// 		{'.', '.', '.', '4', '1', '9', '.', '.', '5'},// 		{'.', '.', '.', '.', '8', '.', '.', '7', '9'}}// 	solveSudoku(b1)// 	printBoard(b1)// 	println()// 	b2 := [][]byte{// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'},// 		{'.', '.', '.', '.', '.', '.', '.', '.', '.'}}// 	solveSudoku(b2)// 	printBoard(b2)// }
 |