给出一个机器人的路线,你要删除其中一段,但机器人路线的终点不能改变,求删除的最短区间。
直接模拟机器人的路线,用pair保存路线上的点,用map保存该点是第几步到达的,若在后面遍历的时候,发现经过点的map不为0,则说明该点之前走过,则可以省略原经过点到现在经过点的步骤数。用ans保存最短可省略的步骤数,ansx、ansy保存最短区间边界。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char a[200005];
typedef pair<ll,ll> p;
typedef map<p,int> m;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
m mp;
int n,ans=0x3f3f3f3f;
int sx=0,sy=0,ansx,ansy;
mp[p(sx,sy)]=1;
scanf("%d",&n);
scanf("%s",a);
for(int i=0; i<n; i++)
{
if(a[i]=='L')
sx--;
else if(a[i]=='R')
sx++;
else if(a[i]=='U')
sy++;
else
sy--;
if(mp[p(sx,sy)])
{
if(ans>i+2-mp[p(sx,sy)])
{
ans=i+2-mp[p(sx,sy)];
ansx=mp[p(sx,sy)];
ansy=i+2;
}
}
mp[p(sx,sy)]=i+2;
}
if(ans==0x3f3f3f3f)
printf("-1\n");
else
printf("%d %d\n",ansx,ansy-1);
}
return 0;
}