题解 | #坐标移动#
坐标移动
http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
算法是递归
递归关键是退出的条件设置,这里是字符串长度变为0。
为啥采用递归呢?
一定是存在重复操作步骤,这里以“;”作分割标志,每个隔出的部分都是相同的约束。
避坑点:
在碰到非法格式的字符串,是还有继续向后比对的,所以不是直接return,而是进入递归再return。
#include <iostream> using namespace std; void count(string str, int& x, int& y){ int size = str.size(); if(size == 0) return; int pos = str.find(";"); if(pos > 3) { str = str.erase(0, pos+1); count(str, x, y); return; } if(str[0] != 'A' && str[0] != 'S' && str[0] != 'D' && str[0] != 'W'){ str = str.erase(0, pos+1); count(str, x, y); return; } for(int i = 1; i < pos; i++){ if(str[i] < 48 || str[i] > 57){ str = str.erase(0, pos+1); count(str, x, y); return; } } string tmp_s = str.substr(1, pos - 1); int num = stoi(tmp_s); if(str[0] == 'A') x-= num; if(str[0] == 'D') x+= num; if(str[0] == 'S') y-= num; if(str[0] == 'W') y+= num; str = str.erase(0, pos+1); count(str, x, y); } int main(){ string str; int x = 0,y = 0; while(cin >> str){ count(str, x, y); cout << x << "," << y << endl; } return 0; }