C. Yet Another Walking Robot-Codeforces Round #617 (Div. 3)

C. Yet Another Walking Robot

题意:

坐标平面上有一个机器人。最初,机器人位于点(0,0)。其路径被描述为长度为n的字符串s
由字符“L”、“R”、“U”、“D”组成。
这些字符中的每一个对应于一些移动:
“L”(左):表示机器人从点(x,y)开始移动到点(x-1,y);
“R”(右):表示机器人从点(x,y)开始移动到点(x+1,y);
“U”(向上):表示机器人从点(x,y)开始移动到点(x,y+1);
“D”(向下):表示机器人从点(x,y)开始移动到点(x,y-1).
创造这个机器人的公司要求你以某种方式优化机器人的路径。为此,可以删除路径的任何非空子字符串。但这家公司不希望他们的客户注意到机器人行为的变化。这意味着,如果在优化之前,机器人在该点结束了它的路径(xe,ye),然后在优化(即从s中移除一些子串)之后,机器人也在该点结束其路径(xe,ye)
此优化是一个低成本的项目,因此您需要删除尽可能短的非空子字符串,以优化机器人的路径,使其路径的端点不会更改。可能无法优化路径。另外,在优化之后,目标路径可能是一个空字符串(即删除的子字符串是整个字符串).
可以通过删除前缀中的一些字符(可能为零)和后缀中的一些字符(可能为零)。例如,“lurlr”的子串是“LU”、“LR”、“lurlr”、“URL”,而不是“RR”和“UL”。

解题思路:

遍历字符串,模拟机器人的移动路径,使用pair<x,y>储存当下机器人所处位置,
使用map将机器人的位置与行进步数(即对应字符串中的位置)联系起来,每一次移动都在map中搜索之前是否存在相同位置(即可删除字符串),若存在则比较可删除字符串大小,留存较小字符串的端点。输出最后端点结果。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t,n;string s;
	cin>>t;
	while(t--)
	{
		cin>>n>>s;
	map<pair<int,int>,int>a;
	int l=-1,r=n;
	pair<int,int>flag(0,0);
	a[flag]=0;
	for(int i=0;i<n;++i)
	{
		if(s[i]=='L') flag.first--;
		if(s[i]=='R') flag.first++;
		if(s[i]=='U') flag.second++;
		if(s[i]=='D') flag.second--;
		if(a.count(flag))
		{
			if(i-a[flag]+1<r-l+1)
			{
				l=a[flag];r=i;
			}
		}a[flag]=i+1;
	}if(l==-1) cout<<"-1"<<endl;
	else cout<<l+1<<' '<<r+1<<endl;
	
	}
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值