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

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

<풀이>

1. 모든 출발 지점에서 모든 방향으로 핀볼을 굴립니다.

2. 각 실행들의 점수 중 최댓값을 출력합니다.

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
using namespace std;
 
//북,동,남,서
int di[] = { -1,0,1,0 };
int dj[] = { 0,1,0,-1 };
 
//방향 반대로 바꾸기
int reverseDir[] = { 2,3,0,1 };
 
//블록만날때 바뀌는 방향 index
int block[6][4= {
    {0,0,0,0},
    {2,3,1,0}, //1번 블록
    {1,3,0,2}, //2번 블록
    {3,2,0,1}, //3번 블록
    {2,0,3,1}, //4번 블록
    {2,3,0,1}  //5번 블록
};
 
int N;
int map[102][102];
int res;
 
int gameStart(int startX, int startY, int startDir) {
 
    //점수
    int score = 0;
 
    //위치
    int x = startX, y = startY, dir = startDir;
 
    //시뮬레이션
    while (true) {
 
        x += di[dir], y += dj[dir];
 
        //5가지 경우(빈칸,블랙홀,벽,블록,웜홀)
 
        //1.빈칸일 경우
        if (map[x][y] == 0) {
            //시작지점으로 돌아왔을 경우 -> 종료
            if (x == startX && y == startY) {
                return score;
            }
        }
 
        //2.블랙홀일 경우 -> 종료
        else if (map[x][y] == -1) {
            return score;
        }
 
        //3.벽일 경우
        else if (map[x][y] == -2) {
            //방향 반대 전환
            dir = reverseDir[dir];
            score++;
        }
 
        //4.블록일 경우
        else if (map[x][y] >= 1 && map[x][y] <= 5) {
            //방향 전환
            dir = block[map[x][y]][dir];
            score++;
        }
 
        //5.웜홀일 경우
        else {
            //위치 변환
            bool isChanged = false;
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    //맵 위의 값이 같고, 좌표가 다를 경우 -> 다른 웜홀 발견
                    if ((map[i][j] == map[x][y]) && !(x == i && y == j)) {
                        x = i, y = j;
                        isChanged = true;
                        break;
                    }
                }
                if (isChanged) {
                    break;
                }
            }
        }
    }
}
 
int main() {
 
    int test_case;
    int T;
 
    cin >> T;
 
    for (test_case = 1; test_case <= T; test_case++) {
 
        //초기화
        for (int i = 0; i < 102; i++) {
            for (int j = 0; j < 102; j++) {
                map[i][j] = -2;
            }
        }
        res = 0;
 
        //입력
        cin >> N;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                cin >> map[i][j];
            }
        }
 
        //핀볼 게임판 전체 탐색
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
 
                //빈칸인 곳에서 핀볼 게임 시작
                if (map[i][j] == 0) {
                    //4방향 모두 굴리기
                    for (int k = 0; k < 4; k++) {
                        //gameStart(x좌표, y좌표, 방향)
                        if (gameStart(i, j, k) > res) {
                            res = gameStart(i, j, k);
                        }
                    }
                }
            }
        }
 
        //출력
        cout << "#" << test_case << " " << res << "\n";
    }
    return 0;
}
 

 

시뮬레이션에 대해 알아볼 수 있는 문제였습니다.

+ Recent posts