こんにちは、ナナオです。
前回に引き続き競プロを実施していきたいと思います。
今回の問題は以下です。
移動が可能かの判定・方向 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】
実装
以下のように実装しました!
package main
import "fmt"
func main(){
var h, w, sy, sx int
var d, m string
fmt.Scan(&h, &w, &sy, &sx, &d, &m)
s := make([]string, h)
for i := 0; i < h; i++ {
fmt.Scan(&s[i])
}
dir := []string{"N", "E", "S", "W"}
var count int
switch d {
case "N": count = 4
case "E": count = 5
case "S": count = 6
case "W": count = 7
}
if m == "R" {
count++
} else {
count--
}
switch dir[count%4] {
case "N": sy--
case "S": sy++
case "E": sx++
case "W": sx--
}
if sy >= h || sx >= w || sy < 0 || sx < 0 || s[sy][sx] == '#' {
fmt.Println("No")
} else {
fmt.Println("Yes")
}
}
でもなんかスリムじゃないですよね。
向いている向きに対しての左右とは、北の場合は西と東、東の場合は北と南のように軸がずれるだけなので、そのように実装します。
package main
import "fmt"
func main(){
var h, w, sy, sx int
var d, m string
fmt.Scan(&h, &w, &sy, &sx, &d, &m)
s := make([]string, h)
for i := 0; i < h; i++ {
fmt.Scan(&s[i])
}
lr := 1
if m == "L" {
lr = -1
}
switch d {
case "N": sx += lr
case "S": sx -= lr
case "E": sy += lr
case "W": sy -= lr
}
if sy >= h || sx >= w || sy < 0 || sx < 0 || s[sy][sx] == '#' {
fmt.Println("No")
} else {
fmt.Println("Yes")
}
}
スリムになりました👍