题解 | 坐标移动
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
#include <iostream>
#include <algorithm>
#include <vector>
/*
本题使用双指针来截取可能存在的子指令。
*/
using namespace std;
int main() {
int corr_x = 0; //初始x坐标
int corr_y = 0; //初始y坐标
vector<int> num; //移动步数
char ins[10001]; //指令字符串
cin.getline(ins, 10001);
int i = 0; //前指针
for(; ins[i] != '\0'; i++){
int j = i; //后指针
for(; ins[j]!='\0'; j++){
if(ins[j] == ';'){ //碰到';',截取出可能的子指令。
break;
}
}
num.clear(); //清空vector,以便保存移动步数。
for(int k=i; k<j; k++){ //方向和移动步数以char形式入vector。
num.push_back(int(ins[k]-'0'));
}
if((num[0] == int('A'-'0'))||(num[0]==int('S'-'0'))||(num[0]==int('D'-'0'))||(num[0]==int('W'-'0'))){ //只有输入'A','S','D','W'才为有效指令
bool valid = true;
for(int k=1;k<num.size();k++){ //同时,该指令其余部分只能为‘0’-‘9’,否则valid=false;
if((num[k]>9)||(num[k]<0)){
valid=false;
break;
}
}
if(valid){ //是合法指令,开始移动坐标
reverse(num.begin(), num.end());
int direction = num[num.size()-1];
num.pop_back(); //删除方向,保证num中只剩数字,代表要移动的步数。
if((num[num.size()-1] > 0)&&(num.empty()==false)){ //避免出现'A01;'这样的指令,所以首位不能为0.如果为0,那么不移动,不进入这个if也无伤大雅。
int base=1;
int step=0;
for(int k=0;k<num.size(); k++){
step += base * num[k];
base *= 10;
}
if((step >=1)&&(step<=99)){
switch(direction){
case int('A'-'0'):
corr_x -= step;
break;
case int('D'-'0'):
corr_x += step;
break;
case int('W'-'0'):
corr_y += step;
break;
case int('S'-'0'):
corr_y -= step;
break;
}
}
}
}
}
i = j; //将头指针移动到尾指针处,准备处理下条子指令。
}
cout<<corr_x<<','<<corr_y;
return 0;
}

