Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type deque21 struct{ l, r []int }11 12func (q deque21) empty() bool { return len(q.l) == 0 && len(q.r) == 0 }13func (q *deque21) pushL(v int) { q.l = append(q.l, v) }14func (q *deque21) pushR(v int) { q.r = append(q.r, v) }15func (q *deque21) popL() (v int) {16 if len(q.l) > 0 {17 q.l, v = q.l[:len(q.l)-1], q.l[len(q.l)-1]18 } else {19 v, q.r = q.r[0], q.r[1:]20 }21 return22}23 24func CF821D(_r io.Reader, out io.Writer) {25 in := bufio.NewReader(_r)26 min := func(a, b int) int {27 if a < b {28 return a29 }30 return b31 }32 33 const inf int = 1e934 type pair struct{ x, y int }35 var n, m, k, x, y int36 Fscan(in, &n, &m, &k)37 id := map[pair]int{}38 for i := 0; i < k; i++ {39 Fscan(in, &x, &y)40 id[pair{x - 1, y - 1}] = i41 }42 43 type nb struct{ to, wt int }44 g := make([][]nb, k+n+m)45 add := func(v, w int) {46 g[v] = append(g[v], nb{w, 1})47 g[w] = append(g[w], nb{v, 0})48 }49 for p, i := range id {50 x, y := p.x, p.y51 if x > 0 {52 if j, has := id[pair{x - 1, y}]; has {53 g[i] = append(g[i], nb{j, 0})54 g[j] = append(g[j], nb{i, 0})55 }56 }57 if y > 0 {58 if j, has := id[pair{x, y - 1}]; has {59 g[i] = append(g[i], nb{j, 0})60 g[j] = append(g[j], nb{i, 0})61 }62 }63 add(i, k+x)64 if x > 0 {65 add(i, k+x-1)66 }67 if x+1 < n {68 add(i, k+x+1)69 }70 add(i, k+n+y)71 if y > 0 {72 add(i, k+n+y-1)73 }74 if y+1 < m {75 add(i, k+n+y+1)76 }77 }78 79 st := id[pair{}]80 dis := make([]int, len(g))81 for i := range dis {82 dis[i] = inf83 }84 dis[st] = 085 q := &deque21{}86 q.pushL(st)87 for !q.empty() {88 v := q.popL()89 for _, e := range g[v] {90 w, d := e.to, e.wt91 if newD := dis[v] + d; newD < dis[w] {92 dis[w] = newD93 if d == 0 {94 q.pushL(w)95 } else {96 q.pushR(w)97 }98 }99 }100 }101 ans := inf102 if v, has := id[pair{n - 1, m - 1}]; has {103 ans = dis[v]104 }105 ans = min(ans, min(dis[k+n-1], dis[k+n+m-1]))106 if ans == inf {107 ans = -1108 }109 Fprint(out, ans)110}111 112113