题解 | #坐标移动#

坐标移动

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



全部评论

相关推荐

LZStarV:冲就好了,就算真的是字节也冲,面评脏了大不了等三四个月就淡了,而且等到那个时候实力进步了选择还多,何必拘泥于字节
点赞 评论 收藏
分享
10-27 02:29
已编辑
门头沟学院 嵌入式工程师
牛客72783561...:简历不是这么写的,你这两个项目只说了用到了什么技术,却没说取得了什么成果,在我看来这就是你自己做的一个demo,没有价值。你为什么不写你电赛国二的那个项目?
点赞 评论 收藏
分享
评论
6
3
分享

创作者周榜

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