tags
枚举
数学
中文题面
狐狸 Ciel 在二维平面上有一个机器人。最初它位于 (0, 0)。狐狸 Ciel 向它发出指令。命令用字符串 s 表示。 s 的每个字符代表一次移动操作。总共有四次移动操作:
'U': 上升,(x, y) → (x, y+1);
'D':向下,(x, y) → (x, y-1);
'L':向左,(x, y) → (x-1, y);
'R':向右,(x, y) → 。(x+1,y)。
机器人将从左到右执行 s 中的操作,并无限次重复。请帮助狐狸 Ciel 判断机器人在执行若干步骤后是否会位于 (a, b) 中。
输入
第一行包含两个整数 a 和 b , ( - 109 ≤ a, b ≤ 109 )。第二行包含字符串 s ( 1 ≤ |s| ≤ 100 、 s 只包含字符’U’、‘D’、‘L’、‘R’)–命令。
输出
如果机器人将位于 (a, b) ,则打印"是",否则打印"否"。
思路
假设能到a b,其实是经过了k次s变换后又经过了部分s变化,我们只需要枚举在最后一步中经历了s的前i次变换,从(a, b)逆推回去得到一点,然后只要看是否经历k次完整变换能到达这个点即可
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main() {
int a, b;
cin >> a >> b;
string s;
cin >> s;
int x = 0, y = 0;
int len = s.length();
for (char c : s) {
if (c == 'U') y++;
else if (c == 'D') y--;
else if (c == 'L') x--;
else x++;
}
for (int i = len - 1; i >= -1; i--) {
int aa = a, bb = b;
int f1 = 0, f2 = 0, j1 = 0, j2 = 0;
for (int j = i; j >= 0; j--) {
if (s[j] == 'U') bb--;
else if (s[j] == 'D') bb++;
else if (s[j] == 'L') aa++;
else aa--;
}
if (aa * x < 0 || bb * y < 0) continue;
if (aa == 0) {
if (x == 0) f1 = 1, j1 = 1;
} else if (x == 0) continue;
if (bb == 0) {
if (y == 0) f2 = 1, j2 = 1;
} else if (y == 0) continue;
if (!j1 && !j2) {
if (aa % x == 0 && bb % y == 0 && aa * y == bb * x) f1 = f2 = 1;
} else if (j1 && !j2) {
if (bb % y == 0) f2 = 1;
} else if (!j1 && j2) {
if (aa % x == 0) f1 = 1;
}
if (f1 * f2) {
cout << "Yes";
return 0;
}
}
cout << "No";
return 0;
}