Codeforces 322C

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;
}
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值