牛客网NOIP赛前集训营-普及组(第一场).B题解

33 篇文章 0 订阅
18 篇文章 0 订阅

题目

小A站在一个巨大的棋盘上。这个棋盘可以看成是一个网格图。这个网格图的大小为 nm n ∗ m 。左上角坐标为 (1,1) ( 1 , 1 ) ,右下角坐标为 (n,m) ( n , m ) 。这个棋盘很特别,他每行每列都是一个环。具体来说,当小A站在第一行,他往上走的时候,他会走到第 n n 行,站在第n行往下走会走到第一行。对于第一列和第 m m 列类似。小A在棋盘上可以上下左右走,假设他站在位置(i,j),向上走,会走到 (i1,j) ( i − 1 , j ) ,向下回到 (i+1,j) ( i + 1 , j ) ,向左到 (i,j1) ( i , j − 1 ) ,向右到 (i,j+1) ( i , j + 1 ) 。注意由于棋盘是循环的,他不会走出这个棋盘。现在小A有一个固定的行走序列 S S ,代表他每一步走的方向,U代表向上, D D 代表向下,L代表向左, R R 代表向右。比如小A一开始在(1,1),棋盘大小为 34 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次。比如上面的例子,当T=2时,真正的行走序列为 UULRDUULRD U U L R D U U L R D 。小A有 q q 个备选的起点位置。他一开始先给定你棋盘大小与行走序列,对于每个起点位置,他想知道,他沿着序列走,最终会走到哪个位置停下。
输入描述:
第一行三个整数n,m,T。接下来一行一个字符串 S S ,代表行走序列。接下来一个整数q。接下来 q q 行,每行两个整数x,y,代表小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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值