알고리즘/시뮬레이션

[백준]미로만들기

안잡아모찌 2019. 8. 23. 14:34

https://www.acmicpc.net/problem/1347

 

1347번: 미로 만들기

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다. 입력으로 홍준이가 적은 내용이 주어진다. 문자열로 이루어져 있으며, 모든 문자 하나는

www.acmicpc.net

맵이 주어져있지 않아서 약간은 참신했던 문제..

방향 전환은 쉽게 했고 (0,0) 부터 시작을 해주면 음수가 나오기 때문에 애매했다.

최대 50번까지 간다고 치면 -50~50까지 갈수있다고 생각했고 음수가 없어야하니까 100x100 맵을 선언해준 후,

원점을 (50,50)이라고 생각해주었다.

또한 원래는 방문 한 곳은 점으로 못한곳은 #로 출력을 해주려고 했는데, 범위가 문제가 되었다.

그래서 가장작은 x,y  가장 큰 x,y를 각각 구해서 범위자체를 구해주어야 했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
int N, d = 2//초기방향 남쪽
bool map[101][101];
int dr[] = { -1,0,1,0 }, dc[] = { 0,1,0,-1 };
 
int main()
{
    cin >> N;
    int start_r = 50, start_c = 50//원점 치환
    map[50][50= true;
 
    int min_r = 50, max_r = 50, min_c = 50, max_c = 50//직사각형의 범위를 위해
    
    for (int i = 0; i < N; i++) {
        char Command;
        cin >> Command;
        if (Command == 'R') d = (d + 1) % 4//우회전
        else if (Command == 'L') d = (d + 3) % 4//좌회전
        else {
            start_r += dr[d], start_c += dc[d];
            map[start_r][start_c] = true;
            if (start_r > max_r) max_r = start_r;
            if (start_r < min_r) min_r = start_r;
            if (start_c > max_c) max_c = start_c;
            if (start_c < min_c) min_c = start_c;
        }
    }
 
    for (int r = min_r; r <= max_r; r++) {
        for (int c = min_c; c <= max_c; c++) {
            if (map[r][c] == trueprintf(".");
            else printf("#");
        }printf("\n");
    }
    return 0;
}
cs