题目
小A站在一个巨大的棋盘上。这个棋盘可以看成是一个网格图。这个网格图的大小为
n∗m
n
∗
m
。左上角坐标为
(1,1)
(
1
,
1
)
,右下角坐标为
(n,m)
(
n
,
m
)
。这个棋盘很特别,他每行每列都是一个环。具体来说,当小A站在第一行,他往上走的时候,他会走到第
n
n
行,站在第行往下走会走到第一行。对于第一列和第
m
m
列类似。小A在棋盘上可以上下左右走,假设他站在位置,向上走,会走到
(i−1,j)
(
i
−
1
,
j
)
,向下回到
(i+1,j)
(
i
+
1
,
j
)
,向左到
(i,j−1)
(
i
,
j
−
1
)
,向右到
(i,j+1)
(
i
,
j
+
1
)
。注意由于棋盘是循环的,他不会走出这个棋盘。现在小A有一个固定的行走序列
S
S
,代表他每一步走的方向,代表向上,
D
D
代表向下,代表向左,
R
R
代表向右。比如小A一开始在,棋盘大小为
3∗4
3
∗
4
。行走序列为
UULRD
U
U
L
R
D
。那么他会依次经过
(3,1),(2,1),(2,4),(2,1),(3,1)
(
3
,
1
)
,
(
2
,
1
)
,
(
2
,
4
)
,
(
2
,
1
)
,
(
3
,
1
)
。但小A觉得只走一遍
S
S
太无聊,因此他会重复走这个序列次。比如上面的例子,当T=2时,真正的行走序列为
UULRDUULRD
U
U
L
R
D
U
U
L
R
D
。小A有
q
q
个备选的起点位置。他一开始先给定你棋盘大小与行走序列,对于每个起点位置,他想知道,他沿着序列走,最终会走到哪个位置停下。
输入描述:
第一行三个整数。接下来一行一个字符串
S
S
,代表行走序列。接下来一个整数。接下来
q
q
行,每行两个整数,代表小A的一个备选起点。
输出描述:
输出q行,每行两个整数,输出对于这个起点,最后的终点是哪里。
示例1
输入
3 6 4
DUUUDLLLLR
3
3 2
2 5
1 4
输出
2 2
1 5
3 4
分析
一道有技巧的简单模拟题,然而还是一道简单模拟题,我们可以在读入字符串后对其进行处理,算出走一遍后横竖坐标移动距离,*t后就是总的移动距离,随后再读入起点,对其进行取模并将其变为正数,因为棋盘没有0这一行,所以再取模前-1,随后+1.
上代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,t,q,xx=0,yy=0;
char al[100010];
int main(){
scanf("%d%d%d",&n,&m,&t);
scanf("%s",al+1);
for(int i=1;i<=strlen(al+1);i++){
if(al[i]=='U')
xx--;
if(al[i]=='D')
xx++;
if(al[i]=='L')
yy--;
if(al[i]=='R')
yy++;
}
xx*=t,yy*=t;
scanf("%lld",&q);
while(q--){
ll x,y;
scanf("%lld%lld",&x,&y);
x=((x+xx)%n+n-1)%n+1,y=((y+yy)%m+m-1)%m+1;
printf("%lld %lld\n",x,y);
}
return 0;
}