当前位置: 首页 > news >正文

牛客网之华为机试题:坐标移动

一. 简介

本文记录牛客网上华为机试题:坐标移动。

二. 牛客网之华为机试题:坐标移动

描述

我们定义一个无限大的二维网格上有一个小人,小人初始位置为 (0,0)(0,0) 点,小人可以读取指令上下左右移动。一个合法的指令由三至四个符号组成:

∙ ∙第一个符号为 "A/D/W/S""A/D/W/S" 中的一个,代表小人移动的方向;分别代表向左、向右、向上、向下移动;记某个时刻小人的坐标为 (x,y)(x,y),向左移动一格即抵达 (x−1,y)(x−1,y)、向右移动一格即抵达 (x+1,y)(x+1,y)、向上移动一格即抵达 (x,y+1)(x,y+1)、向下移动一格即抵达 (x,y−1)(x,y−1)。

∙ ∙最后一个符号为 ‘;’‘;’,代表指令的结束,该符号固定存在;

∙ ∙中间为一个大于 00 且小于 100100 的数字,代表小人移动的距离。特别地,如果这个数字小于 1010,那么它可能包含一个前导零,此时也视为合法。

如果你遇到了一个不合法的指令,则直接忽略;例如,指令 "A100;""A100;" 是不合法的,因为 100100 超出了规定的数字范围;"Y10;""Y10;" 也是不合法的,因为 YY 不是 "A/D/W/S""A/D/W/S" 中的一个。

输出小人最终的坐标。

输入描述:

在一行上输入一个长度 1≦length(s)≦1041≦length(s)≦104,由大写字母、数字和分号(‘;’‘;’)构成的字符串 ss,代表输入的指令序列。保证字符串中至少存在一个 ‘;’‘;’,且末尾一定为 ‘;’‘;’。

输出描述:

在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。

示例1

输入:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出:

10,-10

说明:

对于这个样例,我们模拟小人的移动过程:

∙ ∙第一个指令 "A10;""A10;" 是合法的,向左移动 1010 个单位,到达 (−10,0)(−10,0) 点;

∙ ∙第二个指令 "S20;""S20;" 是合法的,向下移动 2020 个单位,到达 (−10,−20)(−10,−20) 点;

∙ ∙第三个指令 "W10;""W10;" 是合法的,向上移动 1010 个单位,到达 (−10,−10)(−10,−10) 点;

∙ ∙第四个指令 "D30;""D30;" 是合法的,向右移动 3030 个单位,到达 (20,−10)(20,−10) 点;

∙ ∙第五个指令 "X;""X;" 不合法,跳过;

∙ ∙第六个指令 "A1A;""A1A;" 不合法,跳过;

∙ ∙第七个指令 "B10A11;""B10A11;" 不合法,跳过;

∙ ∙第八个指令 ";"";" 不合法,跳过;

∙ ∙第九个指令 "A10;""A10;" 是合法的,向左移动 1010 个单位,到达 (10,−10)(10,−10) 点。

示例2

输入:

ABC;AKL;DA1;D001;W023;A100;S00;

输出:

0,0

说明:

在这个样例中,全部指令均不合法,因此小人不移动。

示例3

输入:

A00;S01;W2;

输出:

0,1

解题思路: 

1. 首先,利用 scanf函数的格式化输入,获取除分号 ;以为的其他字符;

2. 除去非法传参:首先,除去长度大于4的,其次,去掉 方向符号错误的,最后,去掉 移动距离不是数字的。

3. 最后,合法指令进行移动。

C语言实现如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {int x = 0; int y = 0;//逐个处理每个指令while(1) {char buf[4]= {'\0'};//读取除分号;外的字符//除非遇到文件结束符EOFif(scanf("%[^;]", buf) == EOF){break;}//清除输入缓存区中的分号;getchar();//长度大于3,则废弃if(strlen(buf) > 3) {continue;}//方向符号错误,废弃if((buf[0]!='A') && (buf[0]!='D') && (buf[0]!='W') && (buf[0]!='S')) {continue;}//移动数字非法的,废弃if(buf[1] < '0' || buf[1] >'9') {continue;}if(strlen(buf) == 3) {if(buf[2] < '0' || buf[2] >'9') {continue;}}//合法符号,则进行移动switch (buf[0]) {case 'A'://从buf[1]开始的地址开始转换//直到遇到非数字字符x -= atoi(&buf[1]); break;case 'D':x += atoi(&buf[1]); break;case 'W':y += atoi(&buf[1]); break;case 'S':y -= atoi(&buf[1]); break;}}printf("%d,%d\n", x, y);return 0;
}

http://www.dtcms.com/a/302342.html

相关文章:

  • 利用径向条形图探索华盛顿的徒步旅行
  • 数据分析干货| 衡石科技可视化创作之仪表盘控件如何设置
  • 开源智能体-JoyAgent集成ollama私有化模型
  • 【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
  • 攻防世界-引导-Web_php_unserialize
  • Kafka单机如何多Broker实例集群搭建?
  • Python----大模型(基于Fastapi+gradio的对话机器人)
  • 降低焊接机器人保护气体消耗的措施
  • 递归算法的一些具体应用
  • 开发避坑短篇(6):Vue+window.print()打印实践
  • vue如何在data里使用this
  • android-屏幕-刷新流程
  • .NET AI从0开始入门 SemanticKernel 从基础到实践
  • 【GIS数据分享】建筑矢量数据带高度
  • 数据链路层 和 ARP协议
  • 最大连续子数组
  • Makefile if语句用法
  • 【传奇开心果系列】Flet纵向瀑布流本地图片布局排列自定义模板
  • 【硬件】LVGL
  • 15-C语言:第15天笔记
  • keepalived原理及实战部署
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • 张 LLama 多语言语义相似度计算全解析:不同语言 同义词的相似度计算
  • idea启动java应用报错
  • idea编译报错 java: 非法字符: ‘\ufeff‘ 解决方案
  • OSPF笔记
  • 实验-静态路由
  • 解决windows系统下 idea、CLion 控制台中文乱码问题
  • 应急响应处置案例(上)
  • python-并发编程