알고리즘/삼성 SW역량테스트

백준[14503] 로봇 청소기

vhxpffltm 2019. 8. 23. 23:43

링크 https://www.acmicpc.net/problem/14503

 

시뮬레이션 문제이다. 필자는 회전에 대한 구현이 있을 때, 하드코딩을 통헤 dir 변수로 1부터 4까지 if문을 사용하여 해결하지만 이제부터는 반복문을 사용하여 방향을 저장하고 있는 변수를 통해 접근하여 나머지 연산자로 구현을 하려고한다..

 

[위 : 0]  [오른쪽 : 1]  [아래 : 2]  [왼쪽 : 3]  으로 생각하여 항상 시계방향으로 나타낸다. x,y 값이 있기때문에 방향을 담는 자료를 dx[4], dy[4] 에 위의 인덱스에 이동할 값으로 넣어준다. 

 

왼쪽방향으로 회전하기때문에 +3 %4 으로 처리하면 되고 오른쪽이라면 +1 % 4 180도는 +2 % 4 로 처리하면 방향을 쉽게 처리할 수 있다.

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<iterator>
#include<deque>
#include<sstream>
 
using namespace std;
 
int n, m, arr[51][51],sx,sy,dir,visit[51][51],cnt=1;
int dx[4= { -1,0,1,0 }, dy[4= { 0,1,0,-1 },kx,ky;
int main()
{
    cin >> n >> m;
    cin >> sx >> sy >> dir;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&arr[i][j]);
        }
    }
    arr[sx][sy] = 2;
    while(1) {
        int cchk = 0,bp=0;
        for (int i = 0; i < 4; i++) {
            dir = (dir + 3) % 4;
            kx = sx + dx[dir];
            ky = sy + dy[dir];
            //cout << kx << "  " << ky << "  " << dir << endl;
            if (arr[kx][ky] != 0 ) {
                //cout << "방문이미 벽" << endl;
                continue;
            }
            if (kx >= 0 && kx < n && ky >= 0 && ky < m && arr[kx][ky] == 0) {
                //cout << "이동 입장" << endl;
                //cout << kx << "  " << ky << "  " << dir << endl;
                sx = kx, sy = ky;
                cnt++;
                arr[sx][sy] = cnt;
                cchk = 1;
                //cout << kx << " " << ky << " " << dir << endl;
                break;
            }
        }
            if (cchk == 0) {
                //cout << dir << "  ";
                if (dir == 0) {
                    sx++;
                }
                if (dir == 1) {
                    sy--;
                }
                if (dir == 2) {
                    sx--;
                }
                if (dir == 3) {
                    sy++;
                }
                if (arr[sx][sy] == 1) {
                    //cout << a << endl;
                    break;
                }
            }
        
    }
    //for (int i = 0; i < n; i++) {
        //for (int j = 0; j < m; j++) {
            //printf("%2d ", arr[i][j]);
        //}
        //printf("\n");
    //}
    cout << cnt;
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter