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

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

今回の問題は以下です。

リバーシの操作(斜め) | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

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

(ネストが深い…!)

package main
import "fmt"
func main(){
    var h, w, sy, sx int
    fmt.Scan(&h, &w, &sy, &sx)
    g := make([][]rune, h)
    for i := 0; i < h; i++ {
        var s string
        fmt.Scan(&s)
        g[i] = []rune(s)
    }
    
    g[sy][sx] = '*'
    dy := []int{1, 1, -1, -1}
    dx := []int{1, -1, 1, -1}
    for i := 0; i < 4; i++ {
        for j := 1;; j++ {
            ly, lx := sy + dy[i] * j, sx + dx[i] * j
            if ly >= 0 && lx >= 0 && ly < h && lx < w {
                if g[ly][lx] == '*' {
                    for k := j - 1; k > 0; k-- {
                        ny, nx := sy + dy[i] * k, sx + dx[i] * k
                        g[ny][nx] = '*'
                    }
                    break
                }
            } else {
                break
            }
        }
    }
    
    for i := 0; i < h; i++ {
        fmt.Println(string(g[i]))
    }
}

前回はキューを使いましたが、まぁこちらの方がすっきりして見えますね。

👍