【华为机考】【坐标移动】Jave Python C++ C
创始人
2025-05-28 09:57:12
0

描述:

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
非法坐标点需要进行丢弃。如AA10; A1A; %; YAD; 等。

下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
处理过程:
起点(0,0)

  • A10 = (-10,0)
  • S20 = (-10,-20)
  • W10 = (-10,-10)
  • D30 = (20,-10)
  • x = 无效
  • A1A = 无效
  • B10A11 = 无效
  • 一个空 不影响
  • A10 = (10,-10)

结果 (10, -10)

数据范围:每组输入的字符串长度满足 1≤n≤10000

输入描述:

一行字符串

输出描述:

最终坐标,以逗号分隔

示例1

输入:

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

输出:

10,-10

示例2

输入:

ABC;AKL;DA1;

输出:

0,0

知识点:

字符串

Python 版本

解题思路:

把输入按‘;’分割成命令列表,将不同的操作存储到字典里面,根据正则判断是否是有效命令,执行相应的操作。

import sys
import re
x,y=0,0
cmd_list = sys.stdin.readline().strip().split(';')
fun={'A':lambda a,b,p:(a-p,b),'D':lambda a,b,p:(a+p,b),'W':lambda a,b,p:(a,b+p),'S':lambda a,b,p:(a,b-p)
}
for cmd in cmd_list:if re.search(r'^[A|S|W|D]\d\d?$', cmd) and len(cmd)<=3:x,y=fun[cmd[0]](x,y,int(cmd[1:]))
print(f'{x},{y}')

Jave版本

解题思路:

使用正则表达式

import java.util.*;
import java.io.*;public class Main{public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String[] split = bf.readLine().split(";");int result_x = 0;int result_y = 0;for(String s : split){// 不满足题目给定坐标规则if(!s.matches("[WASD][0-9]{1,2}")){continue;}int change = Integer.valueOf(s.substring(1));switch(s.charAt(0)){case 'A':result_x -= change;break;case 'D':result_x += change;break;case 'W':result_y += change;break;case 'S':result_y -= change;break;default:break;}}System.out.println(result_x+","+ result_y);}
}

C++ 版本

解题思路:

使用 stringstream 分隔分号 ; 得到每次操作的指令字符串 t ,然后 regex_match 全文匹配 t 的第一个字符后是否全为数字,接着由 t 的第一个字符判断此次操作的移动方向来对 pair 记录的坐标(0,0)进行操作。

#include 
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);string s,t;while(getline(cin,s)) {stringstream ss(s);pair p(0,0);while(getline(ss,t,';')) {if(t.empty())continue;string _ = t.substr(1);if(regex_match(_,regex("[0-9]*"))) {switch(t[0]) {case 'A': p.first -= stoi(_); break; //左移case 'D': p.first += stoi(_); break; //右移case 'W': p.second += stoi(_); break; //上移case 'S': p.second -= stoi(_); break; //下移default: break; //无效}          }}cout << p.first << "," << p.second << endl;}return 0;
}

C 语言版本

解题思路:

先判断WASD后面接的是否是合法的数字,把每个分号看成一个步骤,再将每个步骤拷贝到字符数组里进行判断,也可以不拷贝直接把指针和步长传给juNum

#includeint juNum(char *str){int len = strlen(str), num = 0;for(int i=0; iif(str[i] >= '0' && str[i] <= '9'){num *= 10;num += (str[i] - '0');}else{//当有任何字符不合法时都会返回0return 0;}}return num;
}
int main(){int x=0, y=0, size=0;//在堆区申请大小为10000字节的空间char *str = (char *)malloc(10000);char step[10] = {0};scanf("%s\n",str);//判断字符串是否到了结尾while(*str != NULL){size = 0;//可以把每个分号看成一个步骤,获取每个步骤的长度while(*str++ != ';') {size++;}memset(step, 0, sizeof(step));memcpy(step, str-size-1, size);switch(step[0]){//如果第一个字符为上下左右,就根据judgeNum返回的数值进行加减case 'A': x-=juNum(&step[1]); break;case 'D': x+=juNum(&step[1]); break;case 'W': y+=juNum(&step[1]); break;case 'S': y-=juNum(&step[1]); break;//如果是其他,就跳过default: break;}}printf("%d,%d\n",x,y);
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...