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

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

今回の問題は以下です。

幅のある移動 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

前回の実装から少し変わりました。

文字列置き換えの処理はちょっとGoっぽいですね。

(Goの文字列はイミュータブル)

package main
import "fmt"
func main(){
    var h, w, sy, sx, n int
    fmt.Scan(&h, &w, &sy, &sx, &n)
    
    s := make([]string, h)
    for i := 0; i < h; i++ {
        fmt.Scan(&s[i])
    }
    
    dir := []string{"N", "E", "S", "W"}
    c := 120
    result := false

    // 初期の座標に印をつける
    runes := []rune(s[sy])
    runes[sx] = '*'
    s[sy] = string(runes)

    for i := 0; i < n; i++ {
        var d string
        var l int
        fmt.Scan(&d, &l)
        
        lr := 1
        if d == "L" {
            lr = -1
        }
        
        for j := 0; j < l; j++ {
            switch dir[c%4] {
                case "N": sx += lr
                case "S": sx -= lr
                case "E": sy += lr 
                case "W": sy -= lr
            }
            
            if sy >= h || sx >= w || sy < 0 || sx < 0 || s[sy][sx] == '#' {
                result = true
                break
            } else {
                runes := []rune(s[sy])
                runes[sx] = '*'
                s[sy] = string(runes)
            }
        }
        c += lr
        
        if result {
            break
        }
    }
    
    for i := 0; i < h; i++ {
        fmt.Println(s[i])
    }
}

一応実装はできたんですが、なんかresultのあたりはもうちょっときれいにできそうな気がする。。

と思って解説見たんですが、同じような実装でしたね。

うーん、まぁ解けたからいいか👍