dar0m! 2019. 9. 29. 17:19
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
1 초 128 MB 31.052%

 

 

3190번: λ±€

문제  'Dummy' λΌλŠ” λ„μŠ€κ²Œμž„μ΄ μžˆλ‹€. 이 κ²Œμž„μ—λŠ” 뱀이 λ‚˜μ™€μ„œ κΈ°μ–΄λ‹€λ‹ˆλŠ”λ°, 사과λ₯Ό 먹으면 λ±€ 길이가 λŠ˜μ–΄λ‚œλ‹€. 뱀이 이리저리 κΈ°μ–΄λ‹€λ‹ˆλ‹€κ°€ λ²½ λ˜λŠ” μžκΈ°μžμ‹ μ˜ λͺΈκ³Ό λΆ€λ”ͺ히면 κ²Œμž„μ΄ λλ‚œλ‹€. κ²Œμž„μ€ NxN 정사각 λ³΄λ“œμœ„μ—μ„œ μ§„ν–‰λ˜κ³ , λͺ‡λͺ‡ μΉΈμ—λŠ” μ‚¬κ³Όκ°€ 놓여져 μžˆλ‹€. λ³΄λ“œμ˜ μƒν•˜μ’Œμš° 끝에 벽이 μžˆλ‹€. κ²Œμž„μ΄ μ‹œμž‘ν• λ•Œ 뱀은 λ§¨μœ„ λ§¨μ’ŒμΈ‘μ— μœ„μΉ˜ν•˜κ³  λ±€μ˜ κΈΈμ΄λŠ” 1 이닀. 뱀은 μ²˜μŒμ— 였λ₯Έμͺ½μ„ ν–₯ν•œλ‹€. 뱀은 λ§€ μ΄ˆλ§ˆλ‹€ 이동을 ν•˜λŠ”λ° λ‹€μŒκ³Ό 같은 κ·œμΉ™μ„ λ”°

www.acmicpc.net

 

ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€

testcase 1

20
13
6 15
7 18
20 14
14 13
11 9
7 10
3 18
10 10
13 13
13 5
6 9
10 4
4 3
19
17 D
36 D
41 D
54 D
56 L
57 L
63 L
68 L
72 L
73 L
76 D
79 D
82 D
85 D
87 D
93 L
105 D
110 D
114 D

좜λ ₯ : 90

testcase 2

5
2
2 5
2 4
6
4 D
5 D
6 D
7 D
8 D
9 D

좜λ ₯ : 14

 

μ‹œν–‰μ°©μ˜€

testcase 1에 ν•΄λ‹Ήν•˜λŠ” κ·Έλ¦Ό

뢄홍색 ν˜•κ΄‘νŽœ = 사과

ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό μ§ˆλ¬Έκ²€μƒ‰μ—μ„œ μ–»μ–΄μ„œ κ·Έλ €λ³΄λŠ”λ° 어쩐지 계속 85κ°€ λ‚˜μ™€μ„œ 뭐지... ν•˜λ‹ˆκΉŒ '56 L' 이 λˆ„λ½λμ—ˆλ‹€ γ„±- μ œλŒ€λ‘œ λ‹€μ‹œ μ‹œμž‘ν•˜λ‹ˆ μ™œ 90μ΄ˆκ°€ λ‚˜μ˜€λŠ”μ§€ μ•Œ 수 μžˆμ—ˆλ‹€.

ν‹€λ Έλ˜ μ΄μœ μ™€ 해결방법

1. 이전에 λͺ‡ 번 ν‹€λ Έμ—ˆλŠ”λ° κ·Έ μ΄μœ λŠ” 뱀은 μžκΈ°μžμ‹ μ˜ 'λͺΈ'κ³Ό λΆ€λ”ͺ히면 κ²Œμž„μ΄ λλ‚˜κ²Œ λ˜λŠ”λ°, λ‚˜λŠ” '꼬리' μœ„μΉ˜λ§Œ μ €μž₯ν•˜μ—¬ λͺΈκ³Ό λΆ€λ”ͺν˜”μ„ λ•Œλ₯Ό λ¬΄μ‹œν•˜κ³  계속 κ²Œμž„μ„ μ§„ν–‰ν–ˆκΈ° λ•Œλ¬Έμ— ν‹€λ Έλ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ 꼬리의 μœ„μΉ˜λŠ” 계속 μœ μ§€ν•˜λ˜, 뱀이 μ§€λ‚˜κ°€λŠ” 뢀뢄을 arr[i][j] 라고 ν•œλ‹€λ©΄ arr[i][j]=2 둜 λ°”κΎΈμ–΄ 뱀인지 μ•„λ‹Œμ§€λ₯Ό νŒλ‹¨ν•˜κ²Œ ν•˜μ˜€λ‹€. λ±€μ˜ 머리가 사과λ₯Ό λ¨Ήμ§€ μ•Šμ•„ 꼬리λ₯Ό ν•œ μΉΈ λ‹ΉκΈ°κ²Œ 될 λ•ŒλŠ”, ν˜„μž¬ 꼬리 μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” arr[tail.first][tail.second]=0 으둜 λ°”κΎΈκ³  꼬리의 λ°©ν–₯λŒ€λ‘œ tail을 κ°±μ‹ ν•œλ‹€.

2. λ³€μˆ˜μ˜ 의미λ₯Ό ν—·κ°ˆλ Έλ‹€.

λ‚΄κ°€ μ½”λ“œλ₯Ό μ§œλ©΄μ„œλ„ λ‘œμ§μ„ μ œλŒ€λ‘œ μƒκ°ν•˜μ§€ μ•Šκ³  λ¨Όμ € μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹€λ³΄λ‹ˆ, μ½”λ“œμˆ˜μ • μ‹œ μ‹€μˆ˜λ₯Ό ν•˜κ²Œ λ˜μ–΄ λ³€μˆ˜μ— λŒ€ν•œ ν˜Όλž€μ΄ μ™€μ„œ 틀리지 μ•Šμ•„λ„ λ˜λŠ” 뢀뢄을 ν‹€λ Έλ‹€. μ•žμœΌλ‘œλŠ” μ œλŒ€λ‘œ λ…ΈνŠΈμ— 필기도 ν•˜κ³  생을 μΆ©λΆ„νžˆν•˜κ³  μ½”λ“œλ₯Ό μ§œμ•Όκ² λ‹€.

 

λ©”λͺ¨λ¦¬ μ‹œκ°„
1160 KB 0 ms
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
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
int arr[105][105];
int n, K, L, i, idx, tail_idx, dir, tail_dir; //idx λŠ” turn μ˜ μΈλ±μŠ€ λ²ˆν˜Έ, dir μ€ λ¨Έλ¦¬ λ°©ν–₯, tail_dir은 κΌ¬λ¦¬ λ°©ν–₯
int dx[] = { 010-1 };
int dy[] = { 10-10 };
pair<intchar> turn[105];
pair<intint> tail;
// μ‚¬κ³ΌλŠ” 1, λ±€μ€ 2, μ•„무것도 μ—†μœΌλ©΄ 0
int main(){    
    scanf("%d %d"&n, &K);
    for (int i = 0, a, b; i < K; i++) {
        scanf("%d %d"&a, &b);
        arr[a][b] = 1// μ‚¬κ³Ό
    }
    scanf("%d"&L);
    int X; char C;
    for (int i = 0; i < L; i++) {
        scanf("%d %c"&X, &C);
        turn[i] = { X, C };
    }
    int r = 1, c = 1, sec = 0, cnt = 0;
    arr[1][1= 2;
    tail = { 1,1 };
    while (r >= 1 && r <= n && c >= 1 && c <= n) {
        int tf = turn[idx].first;    char ts = turn[idx].second;
        
        r = r + dx[dir]; c = c + dy[dir];
        sec++;
        if (arr[r][c] == 2) {
            break;
        }
        if (!arr[r][c]) { // κΌ¬λ¦¬κ°€ μœ„μΉ˜ν•œ μΉΈμ„ λ‹Ήκ²¨μ€€λ‹€.
            cnt++;
            arr[tail.first][tail.second] = 0;
            tail.first = tail.first + dx[tail_dir]; tail.second = tail.second + dy[tail_dir];
        }
        if (sec == tf) { // λ¨Έλ¦¬ λ°©ν–₯μ „ν™˜
            dir = ts == 'L' ? (dir + 3) % 4 : (dir + 1) % 4;
            idx++;
        }
        if (cnt == turn[tail_idx].first) { // κΌ¬λ¦¬ λ°©ν–₯μ „ν™˜
            tail_dir = turn[tail_idx].second == 'L' ? (tail_dir + 3) % 4 : (tail_dir + 1) % 4;
            tail_idx++;
        }        
        arr[r][c] = 2;
    }
    printf("%d", sec);
    return 0;
}
cs