-
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짜리 블록을 추가했습니다.그리고 방향마다 만나는 벽돌을 따로 나눠서 방향을 설정하게 했습니다.맵을 입력할 때, 웜홀을 만나면 좌표를 저장하게 되는데,핀볼이 이동할 때 웜홀을 만나게 되면 진행 방향은 그대로 두고, 핀볼을 해당 숫자와 같은 웜홀로 이동하게 했습니다.이 과정을 벽이 없는 모든 공간에서 실행하면 어렵지 않게 해결할 수 있습니다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116import 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 = { {-1, 0}, {1, 0}, {0, -1}, {0, 1}};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