1 条题解

  • 0
    @ 2025-7-12 19:20:07

    方法思路

    这是一个模拟题,我们需要跟踪牛牛的位置和朝向,根据字符串中的指令更新状态。

    1. 初始位置:(0, 0)
    2. 初始朝向:北方(0, 1)
    3. 指令解析:
      • W:向当前朝向前进一步
      • A:将朝向向左旋转90度(逆时针)
      • D:将朝向向右旋转90度(顺时针)
      • S:原地不动
    4. 使用方向向量表示朝向,便于旋转操作:
      • 北方(0, 1)
      • 西方(-1, 0)
      • 南方(0, -1)
      • 东方(1, 0)

    代码实现

    Java
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            // 使用BufferedReader代替Scanner提高输入效率
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = br.readLine();
            br.close();
            
            int[] position = finalPosition(s);
            System.out.println(position[0] + " " + position[1]);
        }
        
        public static int[] finalPosition(String s) {
            // 初始位置
            int x = 0, y = 0;
            
            // 使用常量数组代替二维数组,减少内存访问
            // 方向向量:北(0,1), 西(-1,0), 南(0,-1), 东(1,0)
            int[] dx = {0, -1, 0, 1};
            int[] dy = {1, 0, -1, 0};
            int directionIdx = 0;  // 初始朝向北方
            
            // 直接遍历字符串而不是转换为字符数组
            int len = s.length();
            for (int i = 0; i < len; i++) {
                char c = s.charAt(i);
                if (c == 'W') {  // 向前走一步
                    x += dx[directionIdx];
                    y += dy[directionIdx];
                } else if (c == 'A') {  // 左转90度
                    directionIdx = (directionIdx + 1) % 4;
                } else if (c == 'D') {  // 右转90度
                    directionIdx = (directionIdx + 3) % 4;  // 等同于-1+4,但避免了减法
                }
                // 若为'S'则不移动
            }
            
            return new int[]{x, y};
        }
    }
    
    
    Python
    def final_position(s):
        # 初始位置
        x, y = 0, 0
        
        # 方向向量:北(0,1), 西(-1,0), 南(0,-1), 东(1,0)
        directions = [(0, 1), (-1, 0), (0, -1), (1, 0)]
        direction_idx = 0  # 初始朝向北方
        
        for char in s:
            if char == 'W':  # 向前走一步
                dx, dy = directions[direction_idx]
                x += dx
                y += dy
            elif char == 'A':  # 左转90度
                direction_idx = (direction_idx + 1) % 4
            elif char == 'D':  # 右转90度
                direction_idx = (direction_idx - 1) % 4
            # 若为'S'则不移动
        
        return x, y
    
    s = input().strip()
    x, y = final_position(s)
    print(f"{x} {y}")
    
    
    C++
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    vector<int> finalPosition(const string& s) {
        // 初始位置
        int x = 0, y = 0;
        
        // 方向向量:北(0,1), 西(-1,0), 南(0,-1), 东(1,0)
        vector<vector<int>> directions = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}};
        int directionIdx = 0;  // 初始朝向北方
        
        for (char c : s) {
            if (c == 'W') {  // 向前走一步
                int dx = directions[directionIdx][0];
                int dy = directions[directionIdx][1];
                x += dx;
                y += dy;
            } else if (c == 'A') {  // 左转90度
                directionIdx = (directionIdx + 1) % 4;
            } else if (c == 'D') {  // 右转90度
                directionIdx = (directionIdx - 1 + 4) % 4;  // 加4确保结果为正
            }
            // 若为'S'则不移动
        }
        
        return {x, y};
    }
    
    int main() {
        string s;
        cin >> s;
        
        vector<int> position = finalPosition(s);
        cout << position[0] << " " << position[1] << endl;
        
        return 0;
    }
    
    
    • 1

    信息

    ID
    61
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者