# unlockpatten ``` go package main import ( "fmt" "slices" ) // 0 1 2 // 3 4 5 // 6 7 8 func main() { var patterns [][]int var dfs func(pt int, route []int) dfs = func(pt int, route []int) { // 若不符合規則 跳出 if !check(pt, route) { return } // 放入目前點 route = append(route, pt) // 長度超過4就是一組 if len(route) >= 4 { copyRoute := slices.Clone(route) patterns = append(patterns, copyRoute) } // 嘗試從每一格開始 for next := range 9 { // 若還未使用的點 if !slices.Contains(route, next) { dfs(next, route) } } } for pt := range 9 { dfs(pt, []int{}) } // 389112 fmt.Println(len(patterns)) } func check(pt int, route []int) bool { // 角落的編號 corner := []int{0, 2, 6, 8} if len(route) > 0 { pre := route[len(route)-1] // 若中間有穿越數字的可能 ( 1 , 2 代表有 有穿過角落 或是 加起來8 代表都+就是X) if slices.Contains(corner, pre) && slices.Contains(corner, pt) || pt+pre == 8 { // 就不能跳過中間 if !slices.Contains(route, (pt+pre)/2) { return false } } } return true } ```