| 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 slow
 
- func 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"))
 
- } */
 
 
  |