package main import ( "bufio" "fmt" "os" ) /* BFS visited[pos][tp] 表示在位置 pos,使用 tp 次传送的状态是否访问过 tp 只有 0 和 1 两种状态(因为用两次等于没用) queue := []State */ type State struct { pos int // 当前位置 (0 ~ n-1) steps int // 已用步数 tp int // 是否使用过传送: 0 或 1 } func minSteps(n, k, a, b, x, y int) int { a-- // 转为 0-indexed b-- // 转为 0-indexed if a == b { return 0 } // visited[pos][tp] 表示在位置 pos,使用 tp 次传送的状态是否访问过 // tp 只有 0 和 1 两种状态(因为用两次等于没用) visited := make([][]bool, n) for i := range visited { visited[i] = make([]bool, 2) // tp: 0 或 1 } // BFS 队列 queue := []State{{a, 0, 0}} visited[a][0] = true for len(queue) > 0 { cur := queue[0] queue = queue[1:] // 出队 nextSteps := cur.steps + 1 // 1. 顺时针移动 x 步 p1 := (cur.pos + x) % n if !visited[p1][cur.tp] { if p1 == b { return nextSteps } visited[p1][cur.tp] = true queue = append(queue, State{p1, nextSteps, cur.tp}) } // 2. 逆时针移动 y 步 p2 := (cur.pos - y + n) % n // +n 防止负数 if !visited[p2][cur.tp] { if p2 == b { return nextSteps } visited[p2][cur.tp] = true queue = append(queue, State{p2, nextSteps, cur.tp}) } // 3. 使用传送技能(跳到对面) if cur.tp == 0 && k >= 1 { // 还没用过,且 k >= 1 p3 := (cur.pos + n/2) % n if !visited[p3][1] { if p3 == b { return nextSteps } visited[p3][1] = true queue = append(queue, State{p3, nextSteps, 1}) } } } return -1 } func main() { reader := bufio.NewReader(os.Stdin) var n, k, a, b, x, y int _, err := fmt.Fscan(reader, &n, &k, &a, &b, &x, &y) if err != nil { panic(err) } result := minSteps(n, k, a, b, x, y) fmt.Println(result) }