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

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

今回の問題は以下です。

いびつなリバーシ対戦(2人) | レベルアップ問題集 | プログラミング学習サイト【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++ {
        for _, v := range []rune{'A', 'B'} {
            var sy, sx int
            fmt.Scan(&sy, &sx)
            
            g[sy][sx] = v
            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] == v {
                            for k := j - 1; k > 0; k-- {
                                ny, nx := sy + dy * k, sx + dx * k
                                g[ny][nx] = v
                            }
                            break
                        }
                    }
                }
            }
        }
    }
    
    for i := 0; i < h; i++ {
        fmt.Println(string(g[i]))
    }
}

もちろん関数化すれば可読性が増す実装はできるでしょう。

ただ競プロなので…まぁいいかな…

ではまた👍