| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | package main// Pos stands for the position of board[y][x]type Pos struct {	x int	y int}func existIter(board [][]byte, word string, visited map[Pos]struct{}, last Pos) bool {	if _, ok := visited[last]; ok {		return false	}	if len(word) == 0 {		return true	}	visited[last] = struct{}{}	for dir := 0; dir < 4; dir++ {		var pos Pos		switch dir {		case 0: // up			if last.y > 0 && board[last.y-1][last.x] == word[0] {				pos = Pos{last.x, last.y - 1}			} else {				continue			}		case 1: // down			if last.y < len(board)-1 && board[last.y+1][last.x] == word[0] {				pos = Pos{last.x, last.y + 1}			} else {				continue			}		case 2: // left			if last.x > 0 && board[last.y][last.x-1] == word[0] {				pos = Pos{last.x - 1, last.y}			} else {				continue			}		default: // right			if last.x < len(board[0])-1 && board[last.y][last.x+1] == word[0] {				pos = Pos{last.x + 1, last.y}			} else {				return false			}		}		newMap := make(map[Pos]struct{})		for k := range visited {			newMap[k] = struct{}{}		}		if existIter(board, word[1:], newMap, pos) {			return true		}	}	return false}// too complex and slowfunc existOld(board [][]byte, word string) bool {	beg := word[0]	for y, row := range board {		for x, v := range row {			if beg == v && existIter(board, word[1:], map[Pos]struct{}{}, Pos{x, y}) {				return true			}		}	}	return false}func exist(board [][]byte, word string) bool {	return false}/* func main() {	b1 := [][]byte{		{'A', 'B', 'C', 'E'},		{'S', 'F', 'C', 'S'},		{'A', 'D', 'E', 'E'},	}	fmt.Println(exist(b1, "ABCCED"))	fmt.Println(exist(b1, "SEE"))	fmt.Println(exist(b1, "ABCB"))	fmt.Println(exist(b1, "FSADEESCCBA"))	fmt.Println(exist(b1, "ZSADEESCCBA"))} */
 |