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

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

今回の問題は以下です。

陣取りゲーム | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

DOTやWALLは定数定義するようにしました。

前回とロジックはそこまで変わっていません。

package main
import "fmt"
const DOT = -1
const WALL = -2
const A = 0
const B = 500000
func main(){
    var h, w int
    var n string
    fmt.Scan(&h, &w, &n)
    
    var qy, qx []int
    var ay, ax, by, bx int
    g := make([][]int, h)
    for i := 0; i < h; i++ {
        var s string
        fmt.Scan(&s)
        row := make([]int, w)
        for j, v := range s {
            switch v {
                case 'A':
                    row[j] = A
                    ay, ax = i, j
                case 'B':
                    row[j] = B
                    by, bx = i, j
                case '#': row[j] = WALL
                default: row[j] = DOT
            }
        }
        g[i] = row
    }
    // 順番を決める
    if n == "A" {
        qy = append(qy, ay, by)
        qx = append(qx, ax, bx)
    } else {
        qy = append(qy, by, ay)
        qx = append(qx, bx, ax)
    }
    
    dy := []int{1, -1, 0, 0}
    dx := []int{0, 0, 1, -1}
    for len(qy) > 0 {
        sy, sx := qy[0], qx[0]
        qy, qx = qy[1:], qx[1:]
        c := g[sy][sx]
        for i := 0; i < 4; i++ {
            ly, lx := sy + dy[i], sx + dx[i]
            if ly >= 0 && lx >= 0 && ly < h && lx < w && g[ly][lx] == DOT {
                g[ly][lx] = c + 1
                qy = append(qy, ly)
                qx = append(qx, lx)
            }
        }
    }
    
    var a, b int
    for i := 0; i < h; i++ {
        for j := 0; j < w; j++ {
            if g[i][j] >= B {
                b++
            } else if g[i][j] >= A {
                a++
            }
        }
    }
    fmt.Println(a, b)
    if a > b {
        fmt.Println("A")
    } else {
        fmt.Println("B")
    }
}

完成しましたが、なんか結構長くなってしまいました。

とはいえ、解説のコードもこのくらいの長さだったので、まぁこのくらいの長さにはなるのかな…?