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

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

今回の問題は以下です。

移動が可能かの判定・方角 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

最初は以下のように実装しました。

package main
import "fmt"
func main(){
    var h, w, sx, sy int
    var m string
    
    fmt.Scan(&h, &w, &sy, &sx, &m)
    
    d := make([]string, h)
    for i := 0; i < h; i++ {
        fmt.Scan(&d[i])
    }
    
    switch m {
        case "E": sx++
        case "W": sx--
        case "S": sy++
        case "N": sy--
    }
    
    if sy >= h || sx >= w || d[sy][sx] == '#' {
        fmt.Println("No")
    } else {
        fmt.Println("Yes")
    }
}

ですが、実行してみるとうまくいかないテストケースがありました。

それもそうで、syとsxが負の値の場合の考慮が漏れていたためです。

これを修正してやることでうまくうごきました。

package main
import "fmt"
func main(){
    var h, w, sx, sy int
    var m stringze
    
    fmt.Scan(&h, &w, &sy, &sx, &m)
    
    d := make([]string, h)
    for i := 0; i < h; i++ {
        fmt.Scan(&d[i])
    }
    
    switch m {
        case "E": sx++
        case "W": sx--
        case "S": sy++
        case "N": sy--
    }
    
    if sy >= h || sx >= w || sy < 0 || sx < 0 || d[sy][sx] == '#' {
        fmt.Println("No")
    } else {
        fmt.Println("Yes")
    }
}

👍