本题主要考察对于字符串操作的熟练程度和代码基本功。首先,以;为间隔符将字符串拆分成各个子串,并放入容器中。其次,遍历容器内的所有子串,剔除非法坐标,计算合法坐标。其中涉及到一些"字符串转字符"、“字符转数字”等细节操作。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s, '\n');
vector<string> move;
int len = s.size();
string temp;
// 以;为分隔符将字符串拆分成各个子串,放入容器中
int subLen = 0;
for (int i = 0; i < len; i++) {
if (s[i] != ';') {
subLen++;
continue;
} else {
move.push_back(s.substr(i - subLen, subLen));
subLen = 0;
}
}
// 遍历容器,找到合法的坐标,并计算移动的坐标
int x = 0, y = 0;
for (int i = 0; i < move.size(); i++) {
string temp = move[i];
// 剔除非法坐标
if (temp.size() > 3) continue;
if (temp.size() == 1) continue;
if (temp[0] != 'A' & temp[0] != 'S' & temp[0] != 'D' & temp[0] != 'W') continue;
const char *numStr = nullptr;
if (temp.size() == 3) {
if (!(temp[1] >= '0' && temp[1] <= '9' && temp[2] >= '0' && temp[2] <= '9')) continue;
// 计算合法坐标
string tempStr = string(1, temp[1]) + string(1, temp[2]);
numStr = tempStr.c_str();
int num = 0;
switch (temp[0]) {
case 'A':
num = atoi(numStr);
x = x - num;
break;
case 'S':
num = atoi(numStr);
y = y - num;
break;
case 'D':
num = atoi(numStr);
x = x + num;
break;
case 'W':
num = atoi(numStr);
y = y + num;
break;
default:
break;
}
}
else if (temp.size() == 2) {
if (!(temp[1] >= '0' && temp[1] <= '9')) continue;
// 计算合法坐标
string tempStr = string(1, temp[1]);
numStr = tempStr.c_str();
int num = 0;
switch (temp[0]) {
case 'A':
num = atoi(numStr);
x = x - num;
break;
case 'S':
num = atoi(numStr);
y = y - num;
break;
case 'D':
num = atoi(numStr);
x = x + num;
break;
case 'W':
num = atoi(numStr);
y = y + num;
break;
default:
break;
}
}
}
cout << x << ',' << y << endl;
return 0;
}