Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func cf1749E(_r io.Reader, _w io.Writer) {11 in := bufio.NewReader(_r)12 out := bufio.NewWriter(_w)13 defer out.Flush()14 type pair struct{ x, y int }15 dir := []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}16 dirR := []pair{{1, 1}, {-1, 1}, {-1, -1}, {1, -1}}17 18 var T, n, m int19o:20 for Fscan(in, &T); T > 0; T-- {21 Fscan(in, &n, &m)22 a := make([][]byte, n)23 for i := range a {24 Fscan(in, &a[i])25 }26 ok := func(i, j int) bool {27 for _, d := range dir {28 x, y := i+d.x, j+d.y29 if 0 <= x && x < n && 0 <= y && y < m && a[x][y] == '#' {30 return false31 }32 }33 return true34 }35 36 dis := make([][]int, n)37 from := make([][]pair, n)38 for i := range dis {39 dis[i] = make([]int, m)40 from[i] = make([]pair, m)41 for j := range dis[i] {42 dis[i][j] = 1e943 from[i][j].x = -144 }45 }46 ql, qr := []pair{}, []pair{}47 for i, row := range a {48 if row[0] == '#' {49 dis[i][0] = 050 ql = append(ql, pair{i, 0})51 } else if ok(i, 0) {52 dis[i][0] = 153 qr = append(qr, pair{i, 0})54 }55 }56 57 for len(ql) > 0 || len(qr) > 0 {58 var p pair59 if len(ql) > 0 {60 ql, p = ql[:len(ql)-1], ql[len(ql)-1]61 } else {62 p, qr = qr[0], qr[1:]63 }64 if p.y == m-1 {65 x, y := p.x, p.y66 for x >= 0 {67 a[x][y] = '#'68 q := from[x][y]69 x, y = q.x, q.y70 }71 Fprintln(out, "YES")72 for _, row := range a {73 Fprintf(out, "%s\n", row)74 }75 continue o76 }77 for _, d := range dirR {78 x, y := p.x+d.x, p.y+d.y79 if 0 <= x && x < n && 0 <= y && y < m && ok(x, y) {80 wt := int(a[x][y]&1 ^ 1) 81 newD := dis[p.x][p.y] + wt82 if newD < dis[x][y] {83 dis[x][y] = newD84 from[x][y] = p85 if wt == 0 {86 ql = append(ql, pair{x, y})87 } else {88 qr = append(qr, pair{x, y})89 }90 }91 }92 }93 }94 Fprintln(out, "NO")95 }96}97 9899