CF 322C. Ciel and Robot 枚举+模拟

题意:初始在(0,0) 操作序列为s,该操作序列可以执行无数次.
-1e9<=a,b<=1e9 .问是否能到达(a,b)这个点?


设x,y为做一次序列s产生的偏移量,f[i],h[i]为 序列s前缀i产生的偏移量.
若存在解 则 a=kx+f[i],b=ky+h[i]  k>=0 枚举i判定条件即可.

注意i==0特判还有dx和dy等于0的情况.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
ll a,b,dx=0,dy=0,f[N],h[N];
char s[N];
int main()
{
    cin>>a>>b;
    scanf("%s",s+1);
    int n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='R')
            dx++;
        if(s[i]=='L')
            dx--;
        if(s[i]=='U')
            dy++;
        if(s[i]=='D')
            dy--;
        f[i]=dx,h[i]=dy;
    }
 //   cout<<dx<<' '<<dy<<endl;
    bool flag=false;
    for(int i=1;i<=n;i++)
    {
        ll k1,k2;
        bool mk=true;
        if(dx==0)
        {
            if(a!=f[i])
                mk=false;
        }
        else
        {
            if((a-f[i])%dx)
                mk=false;
            else
                k1=(a-f[i])/dx;
        }
        if(dy==0)
        {
            if(b!=h[i])
                mk=false;
        }
        else
        {
            if((b-h[i])%dy)
                mk=false;
            else
                k2=(b-h[i])/dy;
        }

        if(mk&&(dx==0||dy==0||k1==k2)&&(k1>=0&&k2>=0))
            flag=true;//cout<<k1<<' '<<k2<<' '<<i<<endl;
    }

    //i==0
    if(dx&&dy)
    {
        if(a%dx==0&&b%dy==0&&a/dx==b/dy&&a/dx>=0)
            flag=true;
    }
    else if(dx==0&&dy)
    {
        if(a==0&&b%dy==0&&b/dy>=0)
            flag=true;
    }
    else if(dx&&dy==0)
    {
        if(b==0&&a%dx==0&&a/dx>=0)
            flag=true;
    }

    if(a==0&&b==0)
        flag=true;

    puts(flag?"Yes":"No");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值