Bootstrap

第 26 场 蓝桥入门赛

3.电子舞龙【算法赛】 - 蓝桥云课

问题描述

话说这年头,连舞龙都得电子化!这不,蓝桥村的老程序员王大爷突发奇想,用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”,它能根据程序指令在村里的广场上“翩翩起舞”。

广场被王大爷抽象成一个二维坐标系,龙头从坐标原点 (0,0) 出发,根据接收到的指令移动:

  • L - 龙头向左移动一格。
  • R - 龙头向右移动一格。
  • U - 龙头向上移动一格。
  • D - 龙头向下移动一格。

秉承着“龙归故里,新年新气象”的寓意,王大爷希望龙头在完成一系列眼花缭乱的舞动后,能够精准地回到最初的起点 (0,0)。

然而,计划赶不上变化,就在演出即将开始之际,一个熊孩子趁王大爷不注意,偷偷修改了电子舞龙的控制指令!这下可好,原本完美的程序被改得乱七八糟,龙头跳完舞后,估计得跑到隔壁村去拜年了!

王大爷拿到被熊孩子涂改过的指令,他知道其中有一些指令是错误的,需要修改一些指令才能让电子龙回到原点。例如,他可以把 L 指令改成 R,或者把 U 改成 D,诸如此类。

现在,请你帮助王大爷计算出最少需要修改多少次指令,才能让电子龙头顺利回到起始点 (0,0)。如果无论怎么改都无法回到起始点,请输出 -1(这意味着今年的电子舞龙表演可能得换成传统的舞狮了)。

输入格式

输入一行,包含一个仅由 L、R、U、D 所构成字符串 S (1 ≤ |S| ≤ 10⁵),表示被熊孩子修改过的错误指令。

输出格式

输出一个整数,表示最少需要修改的指令次数。如果无论如何都无法回到起始点,输出 -1。

样例输入

LLUU

样例输出

2

运行限制

思路:

四个反向符号可以任意改成四个方向符号,所以是净差值之和的偶数,例如RRLUUD

最后是RU,这也是一对。
代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;

typedef long long ll;

int main() {
    ll l = 0, r = 0, u = 0, d = 0;  // 初始化变量
    string s;
    cin >> s;

    // 统计指令数量
    for (ll i = 0; i < s.size(); i++) {
        if (s[i] == 'L') l++;
        if (s[i] == 'R') r++;
        if (s[i] == 'U') u++;
        if (s[i] == 'D') d++;
    }


    if ((abs(l - r) + abs(u - d)) % 2 == 0)
	{
        // 计算最少修改次数
        ll cnt = (abs(l - r) + abs(u - d)) / 2;
        cout << cnt << endl;
    } else {
        cout << -1 << endl;
    }

    return 0;
}