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

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

今回の問題は以下です。

【マップの扱い 2】マップの書き換え・縦横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

以下のように実装しました。

package main
import "fmt"
func main(){
    var h, w, sy, sx int
    fmt.Scan(&h, &w)
    g := make([]string, h)
    for i := 0; i < h; i++ {
        fmt.Scan(&g[i])
    }
    fmt.Scan(&sy, &sx)
    repl := func(sy, sx int, r rune) {
        runes := []rune(g[sy])
        runes[sx] = r
        g[sy] = string(runes)
    }
    dy := []int{1, -1, 0, 0, 0}
    dx := []int{0, 0, 1, -1, 0}
    for i := 0; i < 5; i++ {
        ty, tx := sy + dy[i], sx + dx[i]
        if g[ty][tx] == '.' {
            repl(ty, tx, '#')
        } else {
            repl(ty, tx, '.')
        }
    }
    for i := 0; i < h; i++ {
        fmt.Println(g[i])
    }
}

ですが、ランタイムエラーが頻発してしまいました。。

ということで修正します。

package main
import "fmt"
func main(){
    var h, w, sy, sx int
    fmt.Scan(&h, &w)
    g := make([]string, h)
    for i := 0; i < h; i++ {
        fmt.Scan(&g[i])
    }
    fmt.Scan(&sy, &sx)
    repl := func(sy, sx int, r rune) {
        runes := []rune(g[sy])
        runes[sx] = r
        g[sy] = string(runes)
    }
    dy := []int{1, -1, 0, 0, 0}
    dx := []int{0, 0, 1, -1, 0}
    for i := 0; i < 5; i++ {
        ty, tx := sy + dy[i], sx + dx[i]
        // 以下のif文を追加
        if ty < 0 || tx < 0 || ty >= h || tx >= w {
            continue
        }
        if g[ty][tx] == '.' {
            repl(ty, tx, '#')
        } else {
            repl(ty, tx, '.')
        }
    }
    for i := 0; i < h; i++ {
        fmt.Println(g[i])
    }
}

インデックスが表からはみ出していた場合の考慮が漏れていました。

これで通るようになりました!

ということで今回はこれで👍