题解 | #坐标移动#

坐标移动

https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29

#include <iostream>
#include <string>

using namespace std;

/**
 * @brief 分析位移指令,并更新指令到剩余指令
 * @return 返回<方向, 距离>
 */
pair<char, int> getMove(string *s) { 
    char direction = -1, distance = 0;
    
    // 如果当前指令长度为小于1,说明指令一定非法
    if (s->size() <= 1) 
        return pair<char, int>(direction, distance);
    
    // 检测方向
    switch (s->at(0)) {
        case 'A':
            direction = 'A';
            break;
        case 'W':
            direction = 'W';
            break;
        case 'D':
            direction = 'D';
            break;
        case 'S':
            direction = 'S';
            break;
        case ';': // 如果当前指令为空指令
            s->erase(s->begin()); // 删除当前指令
            return pair<char, int>(direction, distance);
        default:
            break;
    }
    
    // 检测距离
    auto i = s->begin() + 1; 
    while (*i != ';') { // 如果当前指令未结束
        if (*i >= '0' && *i <= '9') { // 距离合法
            distance = distance * 10 + (*i - 48);
        } else { // 距离非法,设置方向非法(后面程序只验证方向的合法性)
            direction = -1;   
        }
        i++;
    }
    
    s->erase(s->begin(), i + 1); // 删除当前指令
    return pair<char, int>(direction, distance);
}

int main() {
    int x = 0, y = 0;
    string s;
    cin >> s;
    
    pair<char, int> cur;
    int n = 0;
    while (!s.empty()) {
        cur = getMove(&s); // s在getMove函数内会被更新,每调用一次getMove函数,s被更新一次
        switch (cur.first) {
            case 'A':
                x -= cur.second;
                break;
            case 'W':
                y += cur.second;
                break;
            case 'D':
                x += cur.second;
                break;
            case 'S':
                y -= cur.second;
                break;
            default:
                break;
        }
    }
    
    cout << x << "," << y << endl;
    
    return 0;
}

全部评论

相关推荐

07-20 21:57
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务