Jovan je šetao gradom po mreži ulica. Kreće se samo u četiri smera:
L — jednu ulicu levoR — jednu ulicu desnoU — jednu ulicu goreD — jednu ulicu dolePonekad se predomisli pa se vrati nazad istim putem:
B — vraćanje jedne ulice unazadJovan je dovoljno pametan da ne pravi kružne putanje tokom svoje šetnje, ali često se desi se istim ulicama vrati nazad.
Pomogni Joanu da odredi najkraći redosled koraka koji opisuje njegovu šetnju od početne do krajnje tačke.
Sa standardnog ulaza se učitava niska \(S\) dužine \(n\) (\(0 < n
< 10^5\)) koju čine karakteri L, R,
U, D, i B.
Na standardni izlaz ispisati nisku najkraćeg niza koraka koja zaista opisuje njegovu putanju.
LRRUUBD
R
LR se poništavaju (ostaje RUUBD).U i B se brišu (ostaje
RUD).U i D se poništavaju (ostaje
R).UDLRLDBRBDU
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
bool are_opposite(char a, char b) {
return (a == 'L' && b == 'R') || (a == 'R' && b == 'L') ||
(a == 'U' && b == 'D') || (a == 'D' && b == 'U');
}
int main()
{
string str; cin >> str;
stack<char> s;
for (char c : str) {
if (c == 'B') {
if (!s.empty()) s.pop();
} else if (!s.empty() && are_opposite(s.top(), c)) {
s.pop();
} else {
s.push(c);
}
}
string res;
while (!s.empty()) {
res.push_back(s.top());
s.pop();
}
reverse(res.begin(), res.end());
cout << res << endl;
return 0;
}