<링크>

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


<풀이>

-body배열 : body[i][j] = 좌표(i,j)가 내 몸이면 1, 아니면 0

//초기에는 사과의 위치로도 쓰인다. 

-comm배열 : comm[i]=j일 때, j는 i초때 전환하는 방향이다.

-toDir배열 : toDir[i][j] = 꼬리가 좌표(i,j)에 있을 때 이동해야한다면 어느방향으로 가야하는가

0. 머리좌표랑 꼬리좌표 다 (1,1)로 초기화 , body[1][1]=1 체크


1. toDir의 머리좌표에 어느방향으로 떠나는지 기록해놓는다. 나중에 해당좌표에서 꼬리를 옮길 때  머리가 떠난 방향 그대로 옮겨야 하기 때문.


2. 방향 대로 머리를 옮기고 시간을 증가시켜준다.


3. 머리가 간 곳이 벽이거나, body배열을 체크했을 때 해당 좌표가 1이면 상태면 프로그램끝.


4. 머리 좌표에 사과가 없으면 body의 꼬리좌표를 0으로 만들어주고, 꼬리를 옮긴다. 옮길 때 아까 적어두었던 toDir배열 참조해서 그 방향 그대로 옮긴다.


5. body배열의 머리 좌표를 1로 갱신


6. 현재 시간에 방향 전환명령이 있으면 방향 갱신

1~6을 반복하면 된다.


<소스코드>

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
#include<stdio.h>
int toDir[101][101]; //나중에 꼬리가 옮겨야할 방향기록
int body[101][101]; //몸이 어느곳을 차지하고있는지
int toI[4= { 0,-1,0,1 }; //좌상우하
int toJ[4= { -1,0,1,0 };
char comm[100000];
int main()
{
    int N, K, L;
    scanf("%d%d"&N, &K);
    int a, b;
    while (K--)
    {
        scanf("%d%d"&a, &b);
        body[a][b] = 2;
    }
    scanf("%d"&L);
    while (L--)
    {
        char c;
        scanf("%d%c%c"&a, &c, &c);
        comm[a] = c;
    }
 
    int sec = 0;
 
    int hi, hj, ti, tj;
    hi = hj = ti = tj = 1;
 
    body[hi][hj] = 1;
 
    int dir = 2;
    while (1)
    {
        ++sec;
        toDir[hi][hj] = dir;
        hi += toI[dir];
        hj += toJ[dir];
        if (hi == 0 || hi == N + 1 || hj == 0 || hj == N + 1 || body[hi][hj] == 1)
            break;
        if (body[hi][hj] != 2//사과 없으면
        {
            body[ti][tj] = 0;
            int d = toDir[ti][tj];
            ti += toI[d];
            tj += toJ[d];
        }
        body[hi][hj] = 1;
        if (comm[sec] != 0)
        {
            if (comm[sec] == 'L')
            {
                if (dir == 0)
                    dir = 3;
                else
                    dir -= 1;
            }
            else
                dir = (dir + 1) % 4;
        }
 
    }
    printf("%d", sec);
}
cs


+ Recent posts