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