题解 | 坐标移动

坐标移动

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;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务