一、题目描述
描述
开发一个坐标计算工具, 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、理解坐标系
首先建立一个坐标系,分别由x轴,y轴;
A是向左,即A10 为 x - 10;
W是向上,即W20 为 y + 20;
S是向下,即S10 为 y - 10;
D是向右,即D20 为 x + 20;
2、排除干扰项
根据题目,可使用以下排除法排除干扰项:
每项有2-3个字符;
第0个字符必须为大写的AWSD其中的一个;
后面的字符必须是数字;(使用Character.isDigit() 或 ascii码 或 正则来判断)
三、java实现
import java.util.Scanner;
/**
* @author zhangnianlei
* @description
* @date 2021/8/2
*/
public class Main {
private final static String DIR_ABCD = "AWDS";
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String[] s = sc.nextLine().split(";");
System.out.println(dealPosition(s));
}
}
private static String dealPosition(String[] s) {
int x = 0, y = 0;
for (String each : s) {
// 根据字符串(A10)构建一个指令对象,为空代表无效指令
MoveOrder order = new MoveOrder().getMoveOrderByStr(each);
if (null == order) continue;
if ("A".equals(order.direction)) {
x -= order.distance;
} else if ("D".equals(order.direction)) {
x += order.distance;
} else if ("W".equals(order.direction)) {
y += order.distance;
} else {
y -= order.distance;
}
}
return x + "," + y;
}
/**
* @description 内部类:指令对象
* @author zhangnianlei
* @date 2021/8/2
* @throws
* @modifier
*/
public static class MoveOrder {
/**
* 移动方向
*/
String direction;
/**
* 移动距离
*/
Integer distance;
public MoveOrder() {
}
public MoveOrder(String direction, Integer distance) {
this.direction = direction;
this.distance = distance;
}
/**
* @description 根据字符串(A10)构建一个指令对象,返回为null代表无效指令
* @author zhangnianlei
* @date 2021/8/2
* @throws
* @param: str
* @return: MoveOrder
* @modifier
*/
public MoveOrder getMoveOrderByStr(String str) {
if (null == str || str.length() == 0) return null;
if (str.length() > 3) return null;
String dir = String.valueOf(str.charAt(0));
if (DIR_ABCD.indexOf(dir) <= -1) return null;
for (int i = 1; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return null;
}
}
String num = str.substring(1, str.length());
MoveOrder order = new MoveOrder(dir, Integer.valueOf(num));
return order;
}
}
}



京公网安备 11010502036488号