2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot

翻译:

有一个机器人在一个没有尽头的方格场上。最初,机器人位于坐标为(0,0)的单元中。他将执行由一串大写拉丁字母“L”、“R”、“D”、“U”所描述的命令。当一个命令被执行时,机器人只是朝着相应的方向移动:

“L”:向左一个单元格(当前单元格的𝑥-coordinate减少1);
“R”:向右一个单元格(当前单元格的𝑥-coordinate增加1);
'D':向下一个单元格(当前单元格的𝑦-coordinate减少1);
'U':向上一个单元格(当前单元格的𝑦-coordinate增加了1)。
您的任务是在字段的一个单元格中放置一个障碍物,以便在执行命令后,机器人将返回其路径(0,0)的原始单元格。当然,在起始单元格(0,0)中不能放置障碍物。可以保证如果没有放置障碍物,那么机器人将不会返回起始单元。

障碍物对机器人的运动的影响是这样的:如果它试图向某个方向前进,并且存在障碍物,那么它只是停留在原地(障碍物也会保留,也就是说它不会消失)。

找到字段(除(0,0)外)中任意一个单元格,如果在那里设置一个障碍物,机器人将在执行所有命令后返回到单元格(0,0)。如果没有解决办法,那就报告。

输入
第一行包含一个整数𝑡(1≤𝑡≤500)——测试用例的数量。

每个测试用例由包含𝑠的单行组成——命令序列,仅由大写拉丁字母‘L’、‘R’、‘D’、‘U’组成。𝑠的长度为1 ~ 5000(含)。𝑠上的附加约束:如果没有障碍,执行此命令序列将机器人引导到(0,0)以外的某个单元格。

测试中所有𝑠的长度之和不超过5000。

输出
对于每个测试用例打印一行:

如果有解决方案,打印两个整数𝑥和𝑦(−109≤𝑥,𝑦≤109),使得(𝑥,𝑦)中的障碍将迫使机器人返回到单元格(0,0);
否则,打印两个0(即。0 0)。
如果有多个答案,则可以打印其中任何一个。

例子
inputCopy
4
l
RUUDL
LLUU
DDDUUUUU
outputCopy
1 0
1 2
0 0
0 1

思路:根据给的操作来进行操作,可以放一个障碍物,让机器人回到起点,如果可以输出障碍物的位置,不可以就输出0 0 。

刚开始我的思路就是特判,操作中含有几个不同的操作,如果是1个那么直接放就好,两个的话,可以判下他们相反,然后来放,不相反就是不可以。

然后其余的我们就用双指针,前后,如果对应就往里面缩,直到不对应了,在判中间的操作是否全部相同,相同的话就可以直接放。

感觉很对emmmmm,但是后来wa了,因为还可以刚开始的一部分不跑,然后中后部分相反对应。

然后发现这道题的数据范围很小,可以直接暴力,我们每次都让他跑,然后在对应的位置放障碍物,看看它不跑障碍物,是否能跑回原点。

代码:

/*Looking! The blitz loop this planet to search way
 
 Only my RAILGUN can shoot it 今すぐ
 
 身体中を  光の速さで
 
 駆け巡った確かな予感
 
 掴め! 望むものなら残さず
 
 輝ける自分らしさで
 
 信じてるよ  あの日の誓いを
 
 この瞳に光る涙それさえも  強さになるから
 
 */
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
#include<stack>
using namespace::std;
typedef long long  ll;
int n,t;
inline __int128 read(){
    __int128 x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(__int128 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}
void ss(int &x,int &y,char a){
    if (a=='R') {
        x++;
    }
    if (a=='L') {
        x--;
    }
    if (a=='D') {
        y--;
    }
    if (a=='U') {
        y++;
    }
}
string s;
void wanyurukong(){
    cin>>s;
    for (int i =0; i<s.size(); i++) {
        int fx=0,fy=0,cx=0,cy=0;
        for (int j =0; j<=i; j++) {
            ss(fx, fy, s[j]);
        }
        for (int k=0; k<s.size(); k++) {
            int anx=cx,any=cy;
            ss(anx, any, s[k]);
            if (anx!=fx||any!=fy) {
                cx=anx;
                cy=any;
            }
        }
        if (cx==0&&cy==0) {
            printf("%d %d\n",fx,fy);return;
        }
    }
    printf("0 0\n");return;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
    cin>>t;
    while (t--) {
        wanyurukong();
    }
    //wanyurukong
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值