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

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

今回の問題は以下です。

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

実装

再帰関数を定義してあげることで自然に実装できました。

package main
import "fmt"
func main(){
    var h, w int
    fmt.Scan(&h, &w)
    
    s := make([]string, h)
    var sx, sy int
    for i := 0; i < h; i++ {
        fmt.Scan(&s[i])
        for j, v := range s[i] {
            if v == '*' {
                sy, sx = i, j
            }
        }
    }
    
    var capture func(sy, sx int)
    capture = func(sy, sx int) {
        for i := 0; i < 4; i++ {
            var ly, lx int
            switch i {
                case 0: ly, lx = sy + 1, sx
                case 1: ly, lx = sy - 1, sx
                case 2: ly, lx = sy, sx + 1
                case 3: ly, lx = sy, sx - 1
            }
            if ly >= 0 && lx >= 0 && ly < h && lx < w && s[ly][lx] != '*' && s[ly][lx] != '#' {
                runes := []rune(s[ly])
                runes[lx] = '*'
                s[ly] = string(runes)
                capture(ly, lx)
            }
        }
    }
    capture(sy, sx)
    
    for i := 0; i < h; i++ {
        fmt.Println(s[i])
    }
}

再帰関数を定義するためにcapture関数の定義をわざわざ二つ書くのがちょっと面倒でした。とはいえGoの言語仕様上しょうがない。。