题解 | #坐标移动#
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
有限自动机(DFA)
因为没想起来用C++的find()函数来分割字符串,就直接用 DFA(有限自动机)的模板来做了,没想到竟然一次性通过了!用DFA的好处是代码比较简洁,不容易遗漏情况,可惜我用的还不太熟练,所以写的有点慢......最后,状态转换的表格见代码末尾
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
struct Cord
{
int x, y;
};
unordered_map<char, Cord> dir= {{'A', {-1, 0}}, {'D', {1, 0}},
{'W', {0, 1}}, {'S', {0, -1}}};
class Automaton
{
enum State {s_end, s_num, s_char, s_bad};
unordered_map<State, vector<State>> ns = {
{s_end, {s_char, s_bad, s_end, s_bad}},
{s_num, {s_bad, s_num, s_end, s_bad}},
{s_char, {s_bad, s_num, s_end, s_bad}},
{s_bad, {s_bad, s_bad, s_end, s_bad}}
};
int get_col(char c)
{
if (c == ';')
return 2;
else if (c <= '9' && c >= '0')
return 1;
else if (dir.find(c) != dir.end())
return 0;
else
return 3;
}
public:
State state = s_end;
int num = 0;
char d;
Cord cord = {0, 0};
void get(char c)
{
int col = get_col(c);
State old = state;
state = ns[state][col];
if (state == s_end)
{
if (old == s_num && num < 100)
{
cord.x += dir[d].x * num;
cord.y += dir[d].y * num;
}
num = 0;
}
else if (state == s_char)
{
d = c;
}
else if (state == s_num)
{
num = num * 10 + c - '0';
}
}
};
int main() {
string s;
getline(cin, s);
Automaton am;
for (auto c : s)
{
am.get(c);
}
cout << am.cord.x << ',' << am.cord.y;
}
/*
ADWS 0~9 ; other
s_end s_char s_bad s_end s_bad
s_num s_bad s_num s_end s_bad
s_char s_bad s_num s_end s_bad
s_bad s_bad s_bad s_end s_bad
*/


