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