HJ17华为机试题解 | #坐标移动#
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
#include <cctype>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 将输入字符串strInput按照seq分隔符进行分割
vector<string> Split(string strInput, string sep = ";")
{
vector<string> resultVec;
while (strInput.find(sep) != string::npos) {
auto found = strInput.find(sep);
if (found != string::npos) {
resultVec.push_back(strInput.substr(0, found));
strInput = strInput.substr(found+1);
}
}
resultVec.push_back(strInput);
return resultVec;
}
// 判断分割后的单个字符串是否是合法的坐标
// @param str:输入字符串
// @param dx: 横向坐标偏移值
// @param dy: 纵向坐标偏移值
// @return 是否为合法的坐标字符串
bool IsValidPos(const string &str, int &dx, int &dy)
{
if (str.size() < 2 || str.size() > 3) {
return false;
}
char direction = str[0];
if (str.size() == 2) {
if (!isdigit(str[1])) {
return false;
}
}
if (str.size() == 3) {
if (!isdigit(str[1]) || !isdigit(str[2])) {
return false;
}
}
int steps = stoi(str.substr(1));
if (direction == 'A') {
dx = -steps;
dy = 0;
} else if (direction == 'D') {
dx = steps;
dy = 0;
} else if (direction == 'W') {
dx = 0;
dy = steps;
} else if (direction == 'S') {
dx = 0;
dy = -steps;
} else {
dx = 0;
dy = 0;
return false;
}
return true;
}
int main() {
string strInput;
while (getline(cin, strInput)) { // 注意 while 处理多个 case
vector<string> resultVec = Split(strInput, ";");
int x = 0;
int y = 0;
for (auto item : resultVec) {
int dx = 0, dy = 0;
bool bRet = IsValidPos(item, dx, dy);
if (bRet) {
x += dx;
y += dy;
}
}
std::cout << x << "," << y << std::endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
