ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#617Div.3

2020-02-05 10:38:39  阅读:289  来源: 互联网

标签:map 617Div.3 int ++ zb vis 端点


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 私信 关注

标签:map,617Div.3,int,++,zb,vis,端点
来源: https://blog.csdn.net/acm_durante/article/details/104178558

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有