摘要:
其实是一道字符串处理题目。
题目
描述
开发一个坐标计算工具, $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
输入:
$A10;S20;W10;D30;X;A1A;B10A11;;A10;$
输出:
$10,-10$
字符串分割
首先将操作指令从字符串中分割出来,对于每一个操作指令,提取其中的坐标偏移。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include <bits/stdc++.h>
using namespace std;
unordered_set<int> st = {'A', 'D', 'W', 'S'};
int main() { #define x first #define y second cin.tie(nullptr)->sync_with_stdio(false); string s; getline(cin, s); vector<string> vec; for (int i = 0, n = s.size(); i < n; i++) { string t; int j = i; for (; j < n && s[j] != ';'; j++) { t += s[j]; } i = j; vec.push_back(t); } pair<int, int> pos = {0, 0}; for (auto &each : vec) { if (!each.size() || !st.count(each[0])) continue; int offset = 0; for (int i = 1; i < each.size(); i++) { if (!isdigit(each[i])) { offset = 0; break; } offset = offset * 10 + each[i] - '0'; } switch (each[0]) { case 'A': pos.x -= offset; break; case 'D': pos.x += offset; break; case 'W': pos.y += offset; break; case 'S': pos.y -= offset; break; } } cout << pos.x << ',' << pos.y << endl; return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
import java.util.*;
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); String[] ops = s.split(";"); List<Character> list = Arrays.asList('A', 'D', 'W', 'S'); Set<Character> hash = new HashSet<>(list); int[] pos = new int[]{0, 0}; for (String each : ops) { if (each.length() == 0 || !hash.contains(each.charAt(0))) continue; int offset = 0; for (int i = 1; i < each.length(); i++) { if (!Character.isDigit(each.charAt(i))) { offset = 0; break; } offset = offset * 10 + each.charAt(i) - 0x30; }
switch (each.charAt(0)) { case 'A': pos[0] -= offset; break; case 'D': pos[0] += offset; break; case 'W': pos[1] += offset; break; case 'S': pos[1] -= offset; break; } } System.out.print(String.valueOf(pos[0]) + "," + String.valueOf(pos[1])); } }
|
苦于C++的STL没有split,只能手写实现,算法复杂度是 $O(N)$,还是很快的。