ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 5650 핀볼게임
    문제 풀이 2020. 5. 12. 19:46

    5650 핀볼게임


    풀이)

    모든 경우를 다 확인하는 문제이다.


    빈 공간이면, 빈 공간에서 시작하여 상하좌우 4방향으로 핀볼이 움직였을 경우 다 확인해봤다.


    1. 핀볼이 웜홀을 만날 때

    웜홀 번호대로 저장해둔 좌표를 확인해서 바꿔줬다.

    vector <pair<int,int>> wallhole[5]; // 벡터 인덱스 0 1 2 3 4 5 는 웜홀 6 7 8 9 10을 뜻한다

    wallhole[0] //웜홀 6의 좌표 2개를 저장

    wallhole[1] //웜홀 7의 좌표 2개를 저장


    2. 핀볼이 블록을 만났을 때 

    각 블록마다 어떤 방향에서 블록을 만났는지, 그로 인해 어떻게 방향이 바뀌는지 를 다 저장해줬다.


    방향을 상 0 하 1 좌 2 우 3이라고 했을때


    1번 블록) 


    파란색이 블록으로 이동한 방향, 초록색이 블록을 만나서 바뀌는 방향이다.

    현재 좌표에서 위쪽 즉 0방향으로 움직였는데, 1번 블록을 만나면 움직이는 방향이 0 위쪽에서 1 아래쪽로 바뀐다.

    현재 좌표에서 아래쪽 즉 1방향으로 움직였는데, 1번 블록을 만나면 움직이는 방향이 1 아래쪽에서 3 오른쪽으로 바뀐다.


    마찬가지로 3번 블록을 예로 들면)

    이런 식으로 생각해서.


    vector <int> block[6];에 저장해줬다 //0 1 2 3 4 5 -> 0은 제외하고 1~5가 블록 1~5를 뜻함


    코드를 보면 이해가 더 쉬울 것이다.


    코드)


    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
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    int n;
    int map[100][100];
    vector <pair<intint>> wallhole[5];
    int dy[4= { -1,1,0,0 };
    int dx[4= { 0,0,-1,1 };
    vector <int> block[6= { {},{1,3,0,2},{3,0,1,2},{2,0,3,1},{1,2,3,0},{1,0,3,2} };
    int result;
     
    void cal(int y, int x, int d) {
        int ny = y, nx = x;
        int dir = d;
        int cnt = 0;
        while (true)
        {
            ny = ny + dy[dir];
            nx = nx + dx[dir];
            if (ny >= 0 && ny < n && nx >= 0 && nx < n) {//범위안에 들때
                if (map[ny][nx] == -1 || (ny == y && nx == x))break;//블랙홀이거나, 원래대로 돌아왔음
                if (map[ny][nx] >= 1 && map[ny][nx] < 6) {//블록부딪힘
                    cnt++;
                    dir = block[map[ny][nx]][dir];
                }
                else if(map[ny][nx] >= 6) {//웜홀만남
                    int num = map[ny][nx] - 6;
                    for (int i = 0; i < 2; i++) {
                        if (ny == wallhole[num][i].first && nx == wallhole[num][i].second) {
                            continue;
                        }
                        else {
                            ny = wallhole[num][i].first;
                            nx = wallhole[num][i].second;
                            break;
                        }
                    }
                }
            }
            else {//벽에 부딪혔을때 방향바꿈
                cnt++;
                if (dir == 0 || dir == 2) {
                    dir += 1;
                }
                else {
                    dir -= 1;
                }
            }
        }
        result = max(result, cnt);
    }
     
    int main() {
        //freopen("sample_input (1).txt", "r", stdin);
        int T = 0;
        scanf("%d"&T);
        for (int test_case = 1; test_case <= T; test_case++) {
            scanf("%d"&n);
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    scanf("%d"&map[i][j]);
                    if (map[i][j] >= 6) { //웜홀
                        wallhole[map[i][j] - 6].push_back({ i,j });
                    }
                    
                }
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (map[i][j] == 0) {//빈공간이면 핀볼 시작.
                        for (int t = 0; t < 4; t++) {//4방향 모두 확인
                            cal(i, j, t);
                        }
                        
                    }
                }
            }
            printf("#%d %d\n", test_case, result);
            for (int i = 0; i < 5; i++) {
                wallhole[i].clear();
            }
            result = 0;
        }
        return 0;
    }
    cs

    '문제 풀이' 카테고리의 다른 글

    [SWEA] 5656 벽돌깨기  (0) 2020.05.14
    [SWEA] 4012 요리사  (0) 2020.05.13
    [SWEZ] 2383 점심 식사시간  (0) 2020.05.11
    [SWEA] 2117. 홈 방범 서비스  (0) 2020.05.09
    [SWEA] 5653. 줄기세포배양  (0) 2020.05.09

    댓글

Designed by Tistory.