[R67B] 朝向
- 难度 入门
- 时限 1s
- 空限 512m
- 模拟
数据规模:。
思路
顺时针方向依次为 N、E、S、W,把朝向映射为下标 0~3:R(顺时针 90°)下标加 1 取模 4,L(逆时针 90°)下标加 3 取模 4。初始下标由初始朝向确定,逐步执行操作并把每次结果拼进答案字符串。
复杂度:时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let dn = reader.readln().getOrThrow().split(" ", removeEmpty: true)
let dirs = "NESW"
var idx: Int64 = 0
if (dn[0] == "E") {
idx = 1
} else if (dn[0] == "S") {
idx = 2
} else if (dn[0] == "W") {
idx = 3
}
let n = Int64.parse(dn[1])
let s = reader.readln().getOrThrow()
let sb = StringBuilder()
for (i in 0..n) {
if (s[i] == UInt8(0x52)) {
idx = (idx + 1) % 4
} else {
idx = (idx + 3) % 4
}
sb.append(Rune(UInt32(dirs[idx])))
}
println(sb.toString())
return 0
}
要点:
- 逆时针转 90° 等价于顺时针转 270°,即下标加 3 取模,与顺时针共用同一套取模运算。
'R'的 ASCII 码是0x52,字符串按字节比较即可区分L/R。- 朝向字符从
"NESW"里按下标取字节,转成Rune后追加进StringBuilder。