こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
陣取りのターン数 | レベルアップ問題集 | プログラミング学習サイト【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()
}
}
割とすっきりかけている気がするけど、これでもまだ長い気はする…