---
# System prepended metadata

title: unlockpatten
tags: [go]

---

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