Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[SWEA] 5650 - 핀볼 게임 본문

Algorithms/SIMULATION

[SWEA] 5650 - 핀볼 게임

꼬지마루 2018. 9. 21. 17:26

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo

(이 글이 문제가 될 시 삭제하도록 하겠습니다.)


'정말 삼성스러운 문제였다'라고 생각했습니다. 이전에 올렸던 벽돌깨기, 보물상자 비밀번호도 같은 생각이 들었습니다.


'출발 위치와 진행 방향을 임의로 선정가능'이라고 제시되어 있기 때문에 핀볼이 놓일 수 있는, 즉 아무런 장애물도 없는 곳에서 모든 방향으로


진행시켜보며 조건만 잘 걸어주면 해결 가능


저는 귀찮아서 그냥 모든 조건을 세부화 시켜서 걸어주었지만, 더 고수분들은 짧게 짰을 것 같다

(저도 평균적으로는 긴편은 아니긴 했지만...)


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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <memory.h>
#include <cstdio>
#define MX 102
using namespace std;
 
struct HOLE {
    int pos;
    int xy[2][2];
}arr[6];
 
int map[MX][MX];
int dx[] = { 00-1};
int dy[] = { -110};
int T, N, dab;
 
int go(int x, int y, int d)
{
    int ret = 0;
    int ix = x, iy = y, id = d, nx, ny;
    while (1)
    {
        ix += dx[id]; iy += dy[id];
        if (ix < || iy < || ix >= N || iy >= N)
        {
            ret++;
            if (id == 0) id = 1;
            else if (id == 1) id = 0;
            else if (id == 2) id = 3;
            else id = 2;
        }
        else if (map[iy][ix] == -1return ret;
        else if (ix == x && iy == y) return ret;
        else if (1<=map[iy][ix] && map[iy][ix] <= 5)
        {
            ret++;
            if (map[iy][ix] == 5)
            {
                if (id == 0) id = 1;
                else if (id == 1) id = 0;
                else if (id == 2) id = 3;
                else id = 2;
            }
            else if (map[iy][ix] == && (id == || id == 3)) id = id == 2;
            else if (map[iy][ix] == && id == 1) id = 3;
            else if (map[iy][ix] == && id == 2) id = 0;
            else if (map[iy][ix] == && (id == || id == 3)) { id = id == 2; }
            else if (map[iy][ix] == && id == 0) id = 3;
            else if (map[iy][ix] == && id == 2) id = 1;
            else if (map[iy][ix] == && (id == || id == 2)) { id = id == 3; }
            else if (map[iy][ix] == && id == 0) id = 2;
            else if (map[iy][ix] == && id == 3) id = 1;
            else if (map[iy][ix] == && (id == || id == 2)) { id = id == 3; }
            else if (map[iy][ix] == && id == 1) id = 2;
            else if (map[iy][ix] == && id == 3) id = 0;
        }
        else if (<= map[iy][ix] && map[iy][ix] <= 10)
        {
            if (arr[map[iy][ix] - 6].xy[0][0== ix && arr[map[iy][ix] - 6].xy[0][1== iy)
            {
                int a = map[iy][ix];
                ix = arr[a - 6].xy[1][0];
                iy = arr[a - 6].xy[1][1];
            }
            else
            {
                int a = map[iy][ix];
                ix = arr[a - 6].xy[0][0];
                iy = arr[a - 6].xy[0][1];
            }
        }
    }
}
 
int main(void)
{
    scanf("%d"&T);
    for (int tc = 1; tc <= T; tc++)
    {
        memset(arr, 0sizeof(arr));
        dab = 0;
        scanf("%d"&N);
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
            {
                cin >> map[i][j];
                if (<= map[i][j] && map[i][j] <= 10)
                {
                    arr[map[i][j] - 6].xy[arr[map[i][j] - 6].pos][0= j;
                    arr[map[i][j] - 6].xy[arr[map[i][j] - 6].pos][1= i;
                    arr[map[i][j] - 6].pos++;
                }
            }
 
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
            {
                if (map[i][j]) continue;
                for (int d = 0; d < 4; d++)
                {
                    int tmp = 0;
                    tmp = go(j, i, d);
                    dab = dab > tmp ? dab : tmp;
                }
            }
        printf("#%d %d\n", tc, dab);
    }
    return 0;
}
cs