こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

陣取りのターン数 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

試行錯誤しながら以下のように実装しました。

1時間くらいかかった。。

ポイントとしては一度g変数でマップを作っている部分ですね。

package main
import (
    "fmt"
)
func main(){
    var h, w, n int
    fmt.Scan(&h, &w, &n)
    
    g := make([][]int, h)
    var qy, qx []int
    for i := 0; i < h; i++ {
        var s string
        fmt.Scan(&s)
        row := make([]int, w)
        for j, v := range s {
            if v == '*' {
                row[j] = 0
                qy = append(qy, i)
                qx = append(qx, j)
            } else if v == '#' {
                row[j] = -2
            } else {
                row[j] = -1
            }
        }
        g[i] = row
    }
    
    m := map[int]struct{}{}
    for i := 0; i < n; i++ {
        var l int
        fmt.Scan(&l)
        m[l] = struct{}{}
    }
    
    dy := []int{1, -1, 0, 0}
    dx := []int{0, 0, 1, -1}
    for len(qy) > 0 {
        sy, sx := qy[0], qx[0]
        qy, qx = qy[1:], qx[1:]
        c := g[sy][sx]
        for i := 0; i < 4; i++ {
            ly, lx := sy + dy[i], sx + dx[i]
            if ly >= 0 && lx >= 0 && ly < h && lx < w && g[ly][lx] == -1 && g[ly][lx] != -2 {
                g[ly][lx] = c + 1
                qy = append(qy, ly)
                qx = append(qx, lx)
            }
        }
    }
    
    for i := 0; i < h; i++ {
        for j := 0; j < w; j++ {
            if g[i][j] == -2 {
                fmt.Printf("%s", "#")
            } else if _, ok := m[g[i][j]]; ok {
                fmt.Printf("%s", "?")
            } else if g[i][j] >= 0 {
                fmt.Printf("%s", "*")
            } else {
                fmt.Printf("%s", ".")
            }
        }
        fmt.Println()
    }
}

割とすっきりかけている気がするけど、これでもまだ長い気はする…