こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
裏返せる可能性(斜め) | レベルアップ問題集 | プログラミング学習サイト【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++ {
row := make([]rune, w)
for j := 0; j < w; j++ {
if i == sy && j == sx {
row[j] = '!'
} else {
row[j] = '.'
}
}
g[i] = row
}
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 {
g[ly][lx] = '*'
} else {
break
}
}
}
for i := 0; i < h; i++ {
fmt.Println(string(g[i]))
}
}
割とすっきり書けたと思います👍
と思って解説を見たら、もっとすっきりかけることに気付きました。
単純にabs(i - sy) == abs(j - sx)のときに陣地になるという風にすればよいですね。
package main
import "fmt"
func main(){
var h, w, sy, sx int
fmt.Scan(&h, &w, &sy, &sx)
for i := 0; i < h; i++ {
for j := 0; j < w; j++ {
ly, lx := i - sy, j - sx
if ly < 0 {
ly = -ly
}
if lx < 0 {
lx = -lx
}
if i == sy && j == sx {
fmt.Printf("%s", "!")
} else if ly == lx {
fmt.Printf("%s", "*")
} else {
fmt.Printf("%s", ".")
}
}
fmt.Println()
}
}
これでよりすっきり書くことができました👍