paizaの練習問題を解く 陣取りの結末 Go編
こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 陣取りの結末 | レベルアップ問題集 | プログラミング学習サイト【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の言語仕様上しょうがない。。