こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
リバーシの操作(斜め) | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
以下のように実装しました。
(ネストが深い…!)
package main
import "fmt"
func main(){
var h, w, sy, sx int
fmt.Scan(&h, &w, &sy, &sx)
g := make([][]rune, h)
for i := 0; i < h; i++ {
var s string
fmt.Scan(&s)
g[i] = []rune(s)
}
g[sy][sx] = '*'
dy := []int{1, 1, -1, -1}
dx := []int{1, -1, 1, -1}
for i := 0; i < 4; i++ {
for j := 1;; j++ {
ly, lx := sy + dy[i] * j, sx + dx[i] * j
if ly >= 0 && lx >= 0 && ly < h && lx < w {
if g[ly][lx] == '*' {
for k := j - 1; k > 0; k-- {
ny, nx := sy + dy[i] * k, sx + dx[i] * k
g[ny][nx] = '*'
}
break
}
} else {
break
}
}
}
for i := 0; i < h; i++ {
fmt.Println(string(g[i]))
}
}
前回はキューを使いましたが、まぁこちらの方がすっきりして見えますね。
👍