题解 | #坐标移动#
坐标移动
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 */