题目
思路
把经过的每一个点进行记录,把一个循环的终点,起点的dx和dy进行记录
然后将输入的点按x,y逐次对比每个被记录的点
我们从一维的方向进行分析
若dx > 0,x > px, x-px是dx的倍数,说明在以后的循环种是可以达到x值的
若dx < 0,x < px, x - px是dx的倍数,同上
若dx = 0,说明最后这个x都会回归到原点,这时候只要有一次x == px,就说明每一次循环都会回到该处
于是倘若12情况下的x和y在同一轮循环里面到达,我们就认为是Yes!
倘若在3的情况下,满足123的任意一种情况,我们也认为是Yes
其他情况下统统不能到达
代码
#include<iostream>
using namespace std;
struct point
{
int x;
int y;
};
int func(int x, int px, int dx)
{
if(dx == 0 && x == px)
return -2;//每一次循环都能到达
else if(dx > 0 && x >= px && (x - px) % dx == 0 )
return (x - px) / dx;
else if(dx < 0 && x <= px && (x - px) % dx == 0 )
return (x - px) / dx;
else
return -1;
}
int main()
{
point p[200];
p[0].x = p[0].y = 0;
string s;
cin >> s;
int len = s.length();
for(int i = 0; i < len; i++)
{
p[i + 1].x = p[i].x;
p[i + 1].y = p[i].y;
switch (s[i])
{
case 'U':
p[i+1].y += 1;
break;
case 'D':
p[i+1].y -= 1;
break;
case 'L':
p[i+1].x -= 1;
break;
case 'R':
p[i+1].x += 1;
break;
}
}
int dx = p[len].x, dy = p[len].y;
int t;
cin >> t;
for(int i = 0; i < t; i++)
{
int x,y;
cin >> x >> y;
int r_x = 0, r_y = 0, r_p = 0;
for(int j = 0; j <= len ; j++)
{
r_x = func(x, p[j].x, dx);
r_y = func(y, p[j].y, dy);
if(r_x == -1 || r_y == -1)
r_p = 0;
else if(r_x == -2 || r_y == -2)
r_p = 1;
else if(r_x == r_y && r_x != -1)
r_p = 1;
else r_p = 0;
if(r_p)
break;
}
if(r_p)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}