您的位置:首页 > 其它

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

2017-10-11 13:43 363 查看
题意:初始在(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
,h
;
char s
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: