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)
	}
}

解题思路

算法分析

这道题的核心是字符串解析坐标模拟。我们需要:

  1. 解析指令字符串:按分号分割指令
  2. 验证指令合法性:检查格式和数值范围
  3. 执行移动:根据合法指令更新坐标

指令格式分析

合法指令格式:[方向][距离];

  • 方向:A(左)、D(右)、W(上)、S(下)
  • 距离:1-99的数字(可以包含前导零)
  • 结束符:分号

代码实现思路

  1. 字符串分割:使用strings.Split()按分号分割
  2. 指令验证: 检查长度(至少3个字符)验证方向字符验证结束符解析并验证数字范围
  3. 坐标更新:使用switch语句处理不同方向

时间复杂度分析

  • 时间复杂度:O(n),其中n是字符串长度
  • 空间复杂度:O(n),用于存储分割后的指令数组

边界情况处理

  1. 空指令:直接跳过
  2. 非法格式:长度不足、方向错误、数字超出范围
  3. 前导零:如"A01;"是合法的
  4. 全部非法:最终位置仍为(0,0)

这个问题的关键在于仔细的字符串解析严格的格式验证,确保只有完全符合规则的指令才会被执行。