ak爷走格子
Description
众所周知,ak爷ljx在计科是个人物。。有一天他在玩游戏,就是操作一个机器人上下左右动的游戏。机器人一开始在(0,0)点,经过任意轮的命令之后,问是不是可以走到目标点(当然也不一定非得要走完一整串命令)。ljx很懒,你能帮他看看能否到达目标点吗?命令有四个,分别是‘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);
Input
多组样例输入。直到处理到文件结束(EOF)。一开始是两个整数a,b.代表机器人所到达的目标点(|a|<=1e9,|b|<=1e9)。接下来是一整串的命令(strlen(s)<=100),里面只有‘U’,‘D’,‘L’,‘R’。
Output
如果可以到达目标点,就输出“Yes”,否则就输出“No”。
Sample Input 1
4 2 UURRDL
Sample Output 1
No
Sample Input 2
2 6 RUUUURLDDDL
Sample Output 2
Yes
Hint
第一个样例没发到达目标点,嘤嘤嘤。
第二个样例到达了目标点。嘻嘻。
谁能帮ljx做出来,他就请谁吃饭。
思路:
设走完某一步之后与(0,0)的坐标变化量为(xi,yi)(0<=i<=len-1)(也可以从1开始,无所谓)
设走了k轮之后又走了若干步之后到达(a,b),一轮的坐标变化量为(x,y)
则a=k*x+xi
b=k*y+yi
所以a-xi=k*x
b-yi=k*y
利用其中一个式子求出k,然后带入另一个看看是否满足,满足就能到达
错误想法:左右两边取模,得a%x=xi,b%y=yi,然后遍历一遍,看是否有满足的
这样是错的,因为取模的话,这两个k可能是不相同的(嘤嘤嘤)
代码中注释掉的是错误代码
#include<cstdio>
#include<cstring>
using namespace std;
struct node {
int x,y;
} p[150];
char s[150];
int main() {
int a,b;
while(~scanf("%d%d",&a,&b)) {
scanf("%s",s);
int len=strlen(s);
int x=0,y=0;
bool flag=false;
if(x==a&&y==b) flag=true;
if(!flag) {
for(int i=0; i<len; i++) {
if(s[i]=='U')
y++;
else if(s[i]=='D')
y--;
else if(s[i]=='L')
x--;
else if(s[i]=='R')
x++;
p[i].x=x,p[i].y=y;
}
// if(p[len-1].x)
// a=(a-p[len-1].x)%p[len-1].x;
// if(p[len-1].y)
// b=(b-p[len-1].y)%p[len-1].y;
// for(int i=0;i<len;i++)
// printf("%3d :%3d %3d\n",i,p[i].x,p[i].y);
// printf("%d %d\n",a,b);
// for(int i=0;i<len-1;i++){
// if(p[i].x==a&&p[i].y==b){
// flag=true;
// break;
// }
// }
int k;
for(int i=0;i<len;i++){
if(x) k=(a-p[i].x)/x;
else if(y) k=(b-p[i].y)/y;
if(k<0) k=0;
if(a==k*x+p[i].x&&b==k*y+p[i].y){
flag=true;
break;
}
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}