巨大的棋盘

题目描述

小A站在一个巨大的棋盘上。这个棋盘可以看成是一个网格图。这个网格图的大小为n*m。左上角坐标为(1,1),右下角坐标为(n,m)。这个棋盘很特别,他每行每列都是一个环。具体来说,当小A站在第一行,他往上走的时候,他会走到第n行,站在第n行往下走会走到第一行。对于第一列和第m列类似。小A在棋盘上可以上下左右走,假设他站在位置(i,j),向上走,会走到(i-1,j),向下回到(i+1,j),向左到(i,j-1),向右到(i,j+1)。注意由于棋盘是循环的,他不会走出这个棋盘。 现在小A有一个固定的行走序列S,代表他每一步走的方向,U代表向上,D代表向下,L代表向左,R代表向右。比如小A一开始在(1,1),棋盘大小为3*4。行走序列为UULRD。那么他会依次经过(3,1),(2,1),(2,4),(2,1),(3,1)。但小A觉得只走一遍S太无聊,因此他会重复走这个序列T次。比如上面的例子,当T=2时,真正的行走序列为UULRDUULRD。 小A有q个备选的起点位置。他一开始先给定你棋盘大小与行走序列,对于每个起点位置,他想知道,他沿着序列走,最终会走到哪个位置停下。

输入描述:

第一行三个整数n,m,T。接下来一行一个字符串S,代表行走序列。注意行走序列在真实走的时候要重复T次。接下来一个整数q。接下来q行,每行两个整数x,y,代表小A的一个备选起点。

输出描述:

输出q行,每行两个整数,输出对于这个起点,最后的终点是哪里。

示例1

输入

3 6 4
DUUUDLLLLR
3
3 2
2 5
1 4

输出

2 2
1 5
3 4

备注:

20%: |S| * T <= 10^6, q = 1
40%: |S| * T <= 10^6, q <= 10^5
60%: |S|, T <= 10^5, q <= 10^5
100%: 1 <= T,n,m <= 10^9, 1 <= x <= n, 1 <= y <= m. 1<= q, |S| <= 10^5其中|S|代表S的长度。

#include<bits/stdc++.h>
using namespace std;
int n,m,t,q;
string s;
long long xx,yy;
int main()
{
    cin>>n>>m>>t>>s>>q;
    for(int j=0;j<s.length();j++)
    {
        if(s[j]=='U')
            xx--;
        if(s[j]=='D')
            xx++;
        if(s[j]=='L')
            yy--;
        if(s[j]=='R')
            yy++;
        xx%=n;   //注意由于棋盘是循环的
        yy%=m;
    }
    xx*=t;
    xx%=n;
    yy*=t;
    yy%=m;
    for(int i=1;i<=q;i++)
    {
        int x,y;
        cin>>x>>y;
        x+=xx;
        y+=yy;
        if(x>n)   //注意由于棋盘是循环的
            x-=n;
        if(y>m)
            y-=m;
        if(x<1)
            x+=n;
        if(y<1)
            y+=m;
        cout<<x<<' '<<y<<endl;
    }
    return 0;
}

来源:nkw

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值