paizaの練習問題を解く 陣取りのターン数 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 陣取りのターン数 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 試行錯誤しながら以下のように実装しました。 1時間くらいかかった。。 ポイントとしては一度g変数でマップを作っている部分ですね。 package main import ( "fmt" ) func main(){ var h, w, n int fmt.Scan(&h, &w, &n) g := make([][]int, h) var qy, qx []int for i := 0; i < h; i++ { var s string fmt.Scan(&s) row := make([]int, w) for j, v := range s { if v == '*' { row[j] = 0 qy = append(qy, i) qx = append(qx, j) } else if v == '#' { row[j] = -2 } else { row[j] = -1 } } g[i] = row } m := map[int]struct{}{} for i := 0; i < n; i++ { var l int fmt.Scan(&l) m[l] = struct{}{} } 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] == -1 && g[ly][lx] != -2 { g[ly][lx] = c + 1 qy = append(qy, ly) qx = append(qx, lx) } } } for i := 0; i < h; i++ { for j := 0; j < w; j++ { if g[i][j] == -2 { fmt.Printf("%s", "#") } else if _, ok := m[g[i][j]]; ok { fmt.Printf("%s", "?") } else if g[i][j] >= 0 { fmt.Printf("%s", "*") } else { fmt.Printf("%s", ".") } } fmt.Println() } } 割とすっきりかけている気がするけど、これでもまだ長い気はする…