ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SWEA 5650 [핀볼 게임]
    알고리즘 풀이/시뮬레이션 2018. 9. 25. 19:58

    SW Expert Academy 핀볼 게임 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo&categoryId=AWXRF8s6ezEDFAUo&categoryType=CODE


    //SWEA는 문제를 무단으로 복제하는 것을 금지하기에, 자세하게 설명하지 않습니다.





    핀볼을 벽에 튀길 때 나오는 최대 점수를 구하는 문제입니다.

    우선, 외벽에 튀기는 것을 처리하기 위해, 가장자리에 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
    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
    import java.util.*;
     
    public class Solution {
        public static int T, N;
        public static int[][] Map = new int[102][102];
        public static int[][][] warm = new int[11][2][2];    //웜홀의 좌표를 저
        public static int[][] d = { {-10}, {10}, {0-1}, {01}};
        public static int Sol(int ori_i, int ori_j, int direc) {
            int result = 0;
            int next_i = ori_i, next_j = ori_j;
            do {
                next_i += d[direc][0];
                next_j += d[direc][1];
                if(Map[next_i][next_j] > 0 && Map[next_i][next_j] < 6) {
                    int block = Map[next_i][next_j];    
                    result++;
                    switch(direc) {
                        case 0: {
                            if(block == 1 || block == 4 || block == 5) direc = 1;
                            else if(block == 2) direc = 3;
                            else direc = 2;
                            break;
                        }
                        case 1:{
                            if(block == 2 || block == 3 || block == 5) direc = 0;
                            else if(block == 1) direc = 3;
                            else direc = 2;
                            break;
                        }
                        case 2: {
                            if(block == 3 || block == 4 || block == 5) direc = 3;
                            else if(block == 1) direc = 0;
                            else direc = 1;
                            break;
                        }
                        case 3: {
                            if(block == 1 || block == 2 || block == 5) direc = 2;
                            else if(block == 3) direc = 1;
                            else direc = 0;
                            break;
                        }
                    }
                }
                else if(Map[next_i][next_j] == -1) {    
                    break;
                }
                else if(Map[next_i][next_j] >= 6) {    //웜홀인경우 
                    int wa_A_i = warm[Map[next_i][next_j]][0][0];
                    int wa_A_j = warm[Map[next_i][next_j]][0][1];
                    int wa_B_i = warm[Map[next_i][next_j]][1][0];
                    int wa_B_j = warm[Map[next_i][next_j]][1][1];
                    if(wa_A_i == next_i && wa_A_j == next_j) {
                        next_i = wa_B_i;
                        next_j = wa_B_j;
                    }
                    else {
                        next_i = wa_A_i;
                        next_j = wa_A_j;
                    }
                }
            }while(!(next_i == ori_i && next_j == ori_j) && Map[next_i][next_j] != -1);
            return result;
        }
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            T = sc.nextInt();
            for(int t= 1; t <= T; t++) {
                N = sc.nextInt();
                int Result = 0;
                boolean[] b = new boolean[11];
                for(int i = 0; i<= N; i++) {
                    Map[i][0= 5;
                    Map[0][i] = 5;
                    Map[N+1][i] = 5;
                    Map[i][N+1= 5;
                }
                for(int i = 1; i <= N; i++) {
                    for(int j = 1; j <= N; j++) {
                        Map[i][j] = sc.nextInt();
                        if(Map[i][j] >= 6) {    //웜홀일 경우 ? 
                            if(!b[Map[i][j]]) {
                                b[Map[i][j]] = true;
                                warm[Map[i][j]][0][0= i;
                                warm[Map[i][j]][0][1= j;
                            }
                            else {
                                warm[Map[i][j]][1][0= i;
                                warm[Map[i][j]][1][1= j;
                            }
                        }
                    }
                }
                for(int i = 1; i <= N; i++) {
                    for(int j = 1; j <= N; j++) {
                        if(Map[i][j] != 0)
                            continue;
                        for(int k = 0; k < 4; k++) {
                            
                            int res = Sol(i, j, k);
                            Result = Result > res ? Result : res;
                        }
                    }
                }
                System.out.println("#" + t + " " + Result);
                for(int i = 0; i <= N; i++
                    for(int j = 0; j <= N; j++)
                        Map[i][j] = 0;
                for(int i = 0; i < 11; i++) {
                    warm[i][0][0= 0;
                    warm[i][0][1= 0;
                    warm[i][1][0= 0;
                    warm[i][1][1= 0;
                }
            }
        }
    }
    cs


    반응형

    '알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글

    SWEA 5644 [무선 충전]  (2) 2018.10.04
    SWEA 5658 [보물상자 비밀번호]  (0) 2018.09.22
    SWEA 5656 [벽돌 깨기]  (2) 2018.09.22
    BOJ 15685 [드래곤 커브]  (3) 2018.09.17

    댓글

Designed by Tistory.