こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
陣取りゲーム | レベルアップ問題集 | プログラミング学習サイト【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")
}
}
完成しましたが、なんか結構長くなってしまいました。
とはいえ、解説のコードもこのくらいの長さだったので、まぁこのくらいの長さにはなるのかな…?