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

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

今回の問題は以下です。

移動が可能かの判定・方向 | レベルアップ問題集 | プログラミング学習サイト【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")
    }
}

スリムになりました👍