C:Yet Another Walking Robot
map的应用
大意: 一个机器人(0,0)点可以进行上(U,y+1)、下(D,y-1)、左(L,x+1)、右(R,x-1)的操作,给你系列操作符(UDLR)让你简化(删除)他的操作指令,达到的终点都是同一位置。只能简化一个区间的。如果不能删除,输出-1,否则输出删除的左端点l和右端点r,使r-l+1应该尽可能小,若有多个相同的答案,输出一个就行。
**题解:**用stl::map开一个数组vis,标记走过的点,进行判断,如果这个点在原来被标记过,并且使得r-l+1小,则来跟新vis[]和左端点l右端点r。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t, n;
string s;
cin >> t;
while (t--)
{
cin >> n >> s;
int l = -1, r = n;
map<pair<int, int>, int> vis;
pair<int, int> zb = {0, 0};
vis[zb] = 0; //vis[]代表起始端
for (int i = 0; i < n; i++) //i代表尾端
{
if (s[i] == 'L')
++zb.first;
if (s[i] == 'R')
--zb.first;
if (s[i] == 'U')
++zb.second;
if (s[i] == 'D')
--zb.second;
if (vis.count(zb)) //在map中,若能找到就输出1,否则为0
{
if (i - vis[zb] < r - l)
{
r = i;
l = vis[zb];
}
}
vis[zb] = i + 1; //储存当前坐标的起始位置
}
if (l == -1)
cout << -1 << endl;
else
cout << l+1 << " " << r+1 << endl;
}
return 0;
}
nefu_马家沟老三
发布了29 篇原创文章 · 获赞 28 · 访问量 5628
私信
关注