package main import ( "fmt" ) func main() { arr := [][]byte{ {'A', 'B', 'C', 'E'}, {'S', 'F', 'C', 'S'}, {'A', 'D', 'E', 'E'}, } word := []byte("SFCE") arrI, arrJ, ok := FindFirstCharPositions(arr, word[0]) if ok { fmt.Printf("%d, %d\n", arrI, arrJ) } fmt.Println(DFSTraverse(arr, word, arrI, arrJ)) } func DFSTraverse(arr [][]byte, word []byte, arrI []int, arrJ []int) (ret bool) { lenArr := len(arr) visited := make([][]bool, lenArr) for i := 0; i < lenArr; i++ { visited[i] = make([]bool, len(arr[i])) } lenArrI := len(arrI) for i := 0; i < lenArrI; i++ { ret = DFS(arr, word, 0, visited, arrI[i], arrJ[i]) if ret == true { return true } } return } func DFS(arr [][]byte, word []byte, index int, visited [][]bool, i int, j int) (ret bool) { if i < 0 || j < 0 || i >= len(visited) || j >= len(visited[i]) || visited[i][j] { return false } if index == len(word) { return true } if arr[i][j] != word[index] { return false } fmt.Printf("%c:%d,%d ", word[index], i, j) visited[i][j] = true index++ ret = DFS(arr, word, index, visited, i-1, j) || DFS(arr, word, index, visited, i, j+1) || DFS(arr, word, index, visited, i+1, j) || DFS(arr, word, index, visited, i, j-1) visited[i][j] = false return ret } func FindFirstCharPositions(arr [][]byte, c byte) (arrI []int, arrJ []int, ok bool) { lenArrRow := len(arr) if lenArrRow == 0 { return } lenArrCol := len(arr[0]) for i := 0; i < lenArrRow; i++ { for j := 0; j < lenArrCol; j++ { if arr[i][j] == c { arrI = append(arrI, i) arrJ = append(arrJ, j) ok = true } } } return }
|