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

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

今回の問題は以下です。

いびつなひとりリバーシ | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

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

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

ネストはさらに深くなりましたが、書きやすかったです。

可読性の面から言えばdy, dxはint配列でもよかったかもしれない。。

まぁいいでしょう👍