题解 | #坐标移动#
坐标移动
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; }