paizaの練習問題を解く 幅のある移動 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 幅のある移動 | レベルアップ問題集 | プログラミング学習サイト【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のあたりはもうちょっときれいにできそうな気がする。。 ...