题解 | #坐标移动#

坐标移动

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

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

typedef struct {
    char direction;//0上,1下,2做,3右
    long long step;
    int offset;
}parse_out_t;


//只是转换正整数,错误则返回0
long long str2ll(char *str, int str_len)
{
    long long ret = 0;
    
    //检查是否是数值字符
    int i = 0;
    //printf("str_len:%d ", str_len);
    for (i = 0; i < str_len; i++) {
        if (str[i] <'0' || str[i] > '9') {
            return 0;
        }
        //printf("%c ", str[i]);
    }


    for (i = 0; i < str_len; i++) {
        int fac = pow(10, str_len-i-1);
        ret += fac * (str[i]- '0');
        //printf("fac:%d ", fac);
    }
    //printf("ret:%lld\n", ret);
    return ret;
}

//返回0表示失败,返回>0表示字符串解析了几个字符
int parse(char *str, parse_out_t *out)
{
    int ret = 0;
    if (!str)
        return 0;

    memset(out, 0, sizeof(parse_out_t));
    out->offset = 1;
    switch (*str) {
    case 'A':
    case 'D':
    case 'W':
    case 'S':
        out->direction = *str;
        break;
    default:
        {
            char * end = strchr(str, ';');
            out->offset = end - str+1;
        }
        return 0;
    }

    char * end = strchr(str, ';');
    if (!end) {
        return 0;
    }

    out->offset = end - str+1;
    if ((out->step = str2ll(str+1, out->offset-2)) == 0) {
        //printf("2ll err ");
        return 0;
    }//A10;S20;W10;D30;X;A1A;B10A11;;A10;

    return 1;
}

int main() {
    char str[10001] = {0};
    memset(str, 0, sizeof(str));
    scanf("%s", str);

    long long x = 0, y = 0;

    //解析
    char *p = str;
    parse_out_t out;
    while (*p != 0) {
        if (parse(p, &out) != 0) {
            switch (out.direction) {
            case 'A':
                x -= out.step;
                break;
            case 'D':
                x += out.step;
                break;
            case 'W':
                y += out.step;
                break;
            case 'S':
                y -= out.step;
                break;
            }
        }
        //printf("offset:%d\n", out.offset);
        p += out.offset;
    }

    printf("%lld,%lld", x, y);
    return 0;
}

强撸灰飞烟灭

改BUG改了很久

没有考虑到坐标字符错误的情况,例如这种情况:B10A11;

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务