# 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
}
```