题解 | #坐标移动#

坐标移动

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
先说说这个题的解题思路:
	相信明眼人一看就能想到,这个题必然是先进行字符串分割,然后对每个小字符串单独判断是否符合移动的要求
	1.本解法采用strtok()函数,每次分割完就进行判断,
	2.判断时如果首字符不是A~Z之间的,那么直接判断不符合,也就是退出判断
	3.如果首字符属于A~Z之间,则继续判断后面的,若后面的存在非数字(只要出现过就退出),即不是0~9之间的数,那么就退出判断函数
	4.如果首字符属于A~Z,且后面没有出现非数字,那么可以调用移动函数,移动的数字使用atoi()函数获取

再说说踩到的坑:
	1.本来想着用C++的方式,发现strtok识别不了string类型,哪怕是用了.c_str()转换都不行,因为得到的不是const
	2.分割字符串后没有立即判断分割得到的字符串是不是为NULL就直接调用判断,导致了程序段错误
	3.判断首字符后面是否有非数字时想复杂了,不需要再判断是否到“;”,因为传进来的时候就没有了“;”,以这个分割
*/
int x = 0, y = 0;
char str[10000] = "";

void move(char c, int n);
void isMove(char* s);

int main() {
    // 输入操作字符串
    scanf("%s", str);

    // 分割字符串
    const char* c = ";";    //  用于分割字符串的 分号 ;
    char* tok = strtok(str, c);
    if (tok != NULL) {
        isMove(tok);
    }
    while (tok != NULL) {
        tok = strtok(NULL, c);
        if (tok != NULL) {
            isMove(tok);
        }
    }

    printf("%d,%d", x, y);
    return 0;
}
//	移动函数
void move(char c, int n) {
    switch (c) {
        case 'A':
            x -= n;
            break;
        case 'S':
            y -= n;
            break;
        case 'D':
            x += n;
            break;
        case 'W':
            y += n;
            break;
    }
}
//	判断是否需要移动
void isMove(char* s) {
    char* p1 = s;
    char* p2 = s;
    if (*p1 >= 'A' && *p1 <= 'Z') {
        ++p1;
        //  如果出现首字母后面不是数字,则退出
        while (*p1) {
            if (*p1 < '0' || *p1 > '9') {
                return;
            }
            ++p1;
        }
    } else {
        return;
    }
    move(*s, atoi(s + 1));
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务