Skip to content

Instantly share code, notes, and snippets.

@devm33
Created August 1, 2019 15:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devm33/f440f7a2c61728a6f07de1cf607238eb to your computer and use it in GitHub Desktop.
Save devm33/f440f7a2c61728a6f07de1cf607238eb to your computer and use it in GitHub Desktop.
solving a boggle problem in go
package main
import "fmt"
func main() {
var board = [][]byte{
[]byte{'A', 'B', 'C', 'E'},
[]byte{'S', 'F', 'C', 'S'},
[]byte{'A', 'D', 'E', 'E'},
}
var tests = map[string]bool{
"ABCCED": true,
// "SEE": true,
// "ABCB": false,
}
for t, e := range tests {
a := exist(board, t)
if a == e {
fmt.Printf("PASSED: Given %v expected %v actual %v\n", t, e, exist(board, t))
} else {
fmt.Printf("FAILED: Given %v expected %v actual %v\n", t, e, exist(board, t))
}
}
}
func exist(board [][]byte, word string) bool {
for r, row := range board {
for c := range row {
if visit(board, word, newVisited(board), r, c) {
return true
}
}
}
return false
}
func visit(board [][]byte, word string, visited [][]bool, row, col int) bool {
if board[row][col] != word[0] {
// fmt.Println("Current char isnt right bailing")
return false
}
// fmt.Printf("Match on %v,%v on word %v, visited is %v\n", row, col, word, visited)
if len(word) == 1 {
return true
}
visited[row][col] = true
a := getUnvisitedAdjacents(board, visited, row, col)
if len(a) == 0 {
// fmt.Println("No available adjacents, bailing")
return false
}
for _, p := range a {
if visit(board, word[1:], visited, p[0], p[1]) {
return true
}
visited[p[0]][p[1]] = false
}
// fmt.Println("All children bailed, bailing")
return false
}
func newVisited(board [][]byte) [][]bool {
r := make([][]bool, len(board))
for i, row := range board {
r[i] = make([]bool, len(row))
}
return r
}
func getUnvisitedAdjacents(board [][]byte, visited [][]bool, row, col int) [][]int {
a := getAdjacents(board, row, col)
r := [][]int{}
for _, p := range a {
if !visited[p[0]][p[1]] {
r = append(r, p)
}
}
return r
}
func getAdjacents(board [][]byte, row, col int) [][]int {
// Assumes a valid row and col
ret := [][]int{}
if row > 0 {
ret = append(ret, []int{row - 1, col})
if col > 0 {
ret = append(ret, []int{row - 1, col - 1})
}
if col < len(board[row])-1 {
ret = append(ret, []int{row - 1, col + 1})
}
}
if row < len(board)-1 {
ret = append(ret, []int{row + 1, col})
if col > 0 {
ret = append(ret, []int{row + 1, col - 1})
}
if col < len(board[row])-1 {
ret = append(ret, []int{row + 1, col + 1})
}
}
if col > 0 {
ret = append(ret, []int{row, col - 1})
}
if col < len(board[row])-1 {
ret = append(ret, []int{row, col + 1})
}
return ret
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment