package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func processInstructions(input string) (int, int) {
x, y := 0, 0
instructions := strings.Split(input, ";")
for _, instruction := range instructions {
if len(instruction) == 0 {
continue
}
if ok, direction, distance := isValidInstruction(instruction); !ok {
continue
} else {
switch direction {
case 'A':
x -= distance
case 'D':
x += distance
case 'W':
y += distance
case 'S':
y -= distance
}
}
}
return x, y
}
func isValidInstruction(instruction string) (bool, byte, int) {
direction := byte(' ')
distance := 0
if len(instruction) < 2 || len(instruction) > 4 {
return false, direction, distance
}
direction = instruction[0]
if direction != 'A' && direction != 'D' &&
direction != 'S' && direction != 'W' {
return false, direction, distance
}
distanceStr := instruction[1:]
for _, char := range distanceStr {
if char < '0' || char > '9' {
return false, direction, distance
}
}
distance, err := strconv.Atoi(distanceStr)
if err != nil {
return false, direction, distance
}
if distance <= 0 || distance >= 100 {
return false, direction, distance
}
return true, direction, distance
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
input := scanner.Text()
if input == "" {
continue
}
x, y := processInstructions(input)
fmt.Printf("%d,%d", x, y)
}
}
解题思路
算法分析
这道题的核心是字符串解析和坐标模拟。我们需要:
- 解析指令字符串:按分号分割指令
- 验证指令合法性:检查格式和数值范围
- 执行移动:根据合法指令更新坐标
指令格式分析
合法指令格式:[方向][距离];
- 方向:A(左)、D(右)、W(上)、S(下)
- 距离:1-99的数字(可以包含前导零)
- 结束符:分号
代码实现思路
- 字符串分割:使用
strings.Split()按分号分割 - 指令验证: 检查长度(至少3个字符)验证方向字符验证结束符解析并验证数字范围
- 坐标更新:使用switch语句处理不同方向
时间复杂度分析
- 时间复杂度:O(n),其中n是字符串长度
- 空间复杂度:O(n),用于存储分割后的指令数组
边界情况处理
- 空指令:直接跳过
- 非法格式:长度不足、方向错误、数字超出范围
- 前导零:如"A01;"是合法的
- 全部非法:最终位置仍为(0,0)
这个问题的关键在于仔细的字符串解析和严格的格式验证,确保只有完全符合规则的指令才会被执行。

京公网安备 11010502036488号