https://www.acmicpc.net/problem/1347
제목 : 미로 만들기
난이도 : Silver II
우리는 F, R, L 3가지 연산을 통해 미로를 이동 할 수 있습니다.
맵을 정해두고 이동을 하는것이 아닌 이동한 좌표를 기반으로 맵을 그려야 하기 때문에 저는 최초에 (0, 0)을 기준으로 방향에 맞춰 연산한 좌표를 모두 한 곳에 저장하고, 음수의 좌표를 전부 정수로 맞춰줘야 한다.
그리고 나서 x 축에서 제일 큰 수 + 1 과 y축에서 제일 큰 수 +1 크기의 맵을 그려서 벽인 "#"으로 채운다음 저장한 좌표에 "."을 넣어 길을 만들어주면 된다.
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<pair<int, int>> getpoints(string s) {
int y = 0, x = 0, dir = 0;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 }; // 아래가 0 왼쪽이 1, 위 2, 오른쪽 3
vector<pair<int, int>> tmp = { {0, 0} };
for (int i = 0; i < s.length(); i++) {
char c = s[i];
if (c == 'R') {
dir = ((dir + 4) - 1) % 4;
}
else if (c == 'L') {
dir = (dir + 1) % 4;
}
else {
y += dy[dir];
x += dx[dir];
tmp.push_back({ y, x });
}
}
return tmp;
}
bool sortop(pair<int, int> a, pair<int, int> b) {
auto [ay, ax] = a;
auto [by, bx] = b;
if (ay == by) return ax < bx;
else return ay < by;
}
pair<int, int> getminpoint(vector<pair<int, int>>& points) { // 음수 중 제일 낮은 좌표를 가져옴
int minY = 10000, minX = 10000;
for (int i = 0; i < points.size(); i++) {
minY = min(minY, points[i].first);
minX = min(minX, points[i].second);
}
return { minY, minX };
}
pair<int, int> getsizeofmap(vector<pair<int, int>> &points) { // y x 사이즈 반환
auto [fy, fx] = getminpoint(points);
int maxY = 0, maxX = 0;
for (int i = 0; i < points.size(); i++) {
if (fy < 0) points[i].first += abs(fy);
if (fx < 0) points[i].second += abs(fx);
maxY = max(maxY, points[i].first);
maxX = max(maxX, points[i].second);
}
return { maxY, maxX };
}
int main()
{
int L;
string order;
cin >> L >> order;
vector<pair<int, int>> points = getpoints(order);
sort(points.begin(), points.end(), sortop);
auto [y, x] = getsizeofmap(points);
vector<string> map;
for (int i = 0; i < y + 1; i++) {
string s = "";
for (int j = 0; j < x + 1; j++) {
s += "#";
}
map.push_back(s);
}
for (int i = 0; i < points.size(); i++) {
auto [y, x] = points[i];
map[y][x] = '.';
}
for (int i = 0; i < map.size(); i++) {
cout << map[i] << "\n";
}
}