链接:https://ac.nowcoder.com/acm/contest/64221/D
来源:牛客网

题目描述

鼠鼠有一个能打扫卫生的机器人,在某片空地上有一个废品(将该空地看成二维平面)。为了让机器人拾起该废品,鼠鼠给机器人下达了指令s(字符串)并设置了该指令最多执行的次数n。字符串s仅由字符U,D,L和R组成,每个字符代表一次移动,具体操作如下:
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中的操作,判断:在最多执行n次s的情况下机器人能不能拾起位于(x,y)处的废品。
注:机器人最开始在(0,0)处。

输入描述:

第一行输入一个整数T(1≤T≤1000)T(1 \le T \le1000)T(1T1000)—测试样例的数量。
		
每个测试样例有三行。第一行两个整数x,y(−109≤x≤109,−109≤y≤109)x,y(-10^9 \le x \le 10^9,-10^9 \le y \le 10^9 )x,y(109x109,109y109)表示废品的坐标,第二行一个整数n(1≤n≤109)n(1 \le n \le 10^9)n(1n109)表示执行指令的次数,第三行一个字符串s(1≤∣s∣≤10001\le \left\vert s \right \vert \le10001s1000,仅有‘U’,‘D’,‘L’,‘R’组成)表示操作指令。

输出描述:

对于每个测试样例,输出“Yes”或者“No”.
示例1

输入

复制 1 1 1 1 URL
1
1 1
1
URL

输出

复制 Yes
Yes

说明

操作一次指令,机器人从(0,0)先移动到(0,1),再由(0,1)移动到(1,1),此时能拾起废品,所以结果输出“Yes”。
示例2

输入

复制 1 2 2 2 UL
1
2 2
2
UL

输出

复制 No
No

说明

操作一次指令,机器人由(0,0)移动到(0,1),由(0,1)移动到(-1,1),操作第二次指令,机器人由(-1,1)移动到(-1,2),再由(-1,2)移动到(-2,2),操作两次指令后没有拾起废品,所以输出“No”。
由于是重复移动那么就可以找到一些规律,可以看到机器人每一个周期的移动其实相当于将第一个周期移动的距离乘于周期数,假设一个周期之后机器人在(x,y)的位置,那么机器人某个周期的位置就是(k*x, k*y)。但这样还不够,根据题目中给出得样例可以看出在路径上的情况也算,那么可以得到:设机器人向上移动那么机器人的x坐标就应该是k*x+1,一次类推机器人在每一个周期里面的移动都有这样的特性。通过计算周期的取余就可以得到当前的x和y是否符合最基本的要求。然后还需要判断当前周期是否相同。要注意x=0或y=0的特殊情况要特殊处理。
#include <bits/stdc++.h>


using namespace std;

bool yanz(int d, int s) {
    if (d==0) {
        return true;
    }
    if (s==0) return false;
    return d%s==0? true : false;
}

void solve() {
    int sx=0, sy=0, tx=0, ty=0;
    int x, y;
    scanf("%d %d", &x, &y);
    int n;
    scanf("%d", &n);
    string s;
    cin>>s;
    if (!x&&!y) {
        cout<<"Yes\n";
        return ;
    }
    //先计算一轮指令过后机器人的位置
    for (int i=0;i<s.size();i++) {
        if (s[i]=='U') sy++;
        else if (s[i]=='D') sy--;
        else if (s[i]=='L') sx--;
        else if (s[i]=='R') sx++;
        if (sx == x && sy == y) {
            cout << "Yes\n";
            return;
        }
    }
    if (!sx && !sy) {
        cout << "No\n";
        return;
    }
    //在遍历一轮,此次遍历每一次都可以根据位置去找寻所有相应位置的情况
    for (int i=0;i<s.size();i++) {
        if (s[i]=='U') ty++;
        else if (s[i]=='D') ty--;
        else if (s[i]=='L') tx--;
        else if (s[i]=='R') tx++;
        int dx = x-tx, dy = y-ty;
//         if (dx && (!sx || dx % sx)) {
//             continue;
//         }
//         if (dy && (!sy || dy % sy)) {
//             continue;
//         }
        if (yanz(dx, sx)&&yanz(dy, sy)) {
            int sdx, sdy;
            if (sx==0) sdx = 0;
            else sdx = dx/sx;
            if (sy==0) sdy = 0;
            else sdy = dy/sy;
            if ((!sdx || !sdy || sdx == sdy) &&sdx>=0&&sdx<n&&sdy>=0&&sdy<n) {
                cout<<"Yes\n";
                return ;
            }
        }
    }
    cout<<"No\n";
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        solve();
    }
    
    
    return 0;
}