题解 | #坐标移动#

坐标移动

http://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29

纯模拟,双指针,逐个判断。
#include<stdio.h>
#include<string.h>

//检查每一次的输入是否正确,不正确返回-1,正确则返回移动的距离。
int check(char *s,int left,int right){
    int value = 0;
    int len = right - left;
        //输入长度是否合法
    if(len > 3 || len < 2) return -1;
        //第一个字符是否合法
    switch(s[left]){
        case 'A':
        case 'S':
        case 'W':
        case 'D':
                        //数字字符是否合法
            if(len==2){
                if(s[left+1]<'0'||s[left+1]>'9') return -1;
                else return s[left+1] - '0';
            }
            else{
                if(s[left+1]<'0'||s[left+1]>'9') return -1;
                if(s[left+2]<'0'||s[left+2]>'9') return -1;
                                //两位数的距离。
                return (s[left+1] - '0')*10 + s[left+2] - '0';
            }
        default:return -1;
    }
    return value;
}

int main(){
    char s[10001] = {0};
    scanf("%s\n",s);
    int x = 0;
    int y = 0;
        //双指针限制每次的输入,left指向起点,right指向每个分号。
    int left = 0;
    int right = 0;
    int len = strlen(s);
    for(int i = 0; i < len; i++){
        int temp = 0;
        if(s[i]==';'){
            right = i;
            temp = check(s, left, right);
                        //如果移动距离合法,则根据情况修改坐标。
            if(temp!=-1){
                switch(s[left]){
                    case 'A':x = x - temp;break;
                    case 'S':y = y - temp;break;
                    case 'W':y = y + temp;break;
                    case 'D':x = x + temp;break;
                }
            }
                        //left移动到下一个输入的起点
            left = right+1;
        }
    }
    printf("%d,%d",x,y);
    return 0;
}



全部评论

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
评论
5
3
分享
牛客网
牛客企业服务