[SWEA] 5650. [모의 SW 역량테스트] 핀볼 게임

Mar 7, 2019


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

시뮬레이션 문제였습니다.

구슬 위치와 방향마다 다르기 때문에 반복문을 통해 완전탐색 시켜줬습니다.

자세한건 코드에 주석으로 설명했습니다.

#include <iostream>
using namespace std;
int n, result, sx, sy;
int map[101][101];
int dx[] = { -1,1,0,0 };//상하좌우
int dy[] = { 0,0,-1,1 };
int block[6][4] = { {0,0,0,0},{1,3,0,2},{3,0,1,2},{2,0,3,1},{1,2,3,0},{1,0,3,2} };//블록만났을때 방향
struct Wormhole {
    int x1;
    int y1;
    int x2;
    int y2;
}wormhole[11];
bool wormCheck[11];
void start(int x, int y, int dir, int cnt) {
    int nx = x;
    int ny = y;
    while (1) {
        nx += dx[dir];
        ny += dy[dir];
        if (map[nx][ny] == -1) break;//블랙홀
        else if (nx == sx && ny == sy) break;//시작지점
        else if (map[nx][ny] >= 1 && map[nx][ny] <= 5) {//블록
            start(nx, ny, block[map[nx][ny]][dir], cnt + 1);
            break;
        }
        else if (map[nx][ny] >= 6 && map[nx][ny] <= 10) {//wormHole
            if (nx == wormhole[map[nx][ny]].x1&&ny == wormhole[map[nx][ny]].y1)
                start(wormhole[map[nx][ny]].x2, wormhole[map[nx][ny]].y2, dir, cnt);
            else start(wormhole[map[nx][ny]].x1, wormhole[map[nx][ny]].y1, dir, cnt);
            break;
        }
    }
    result = result > cnt ? result : cnt;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int test_case;
    cin >> test_case;
    for (int t = 1; t <= test_case; t++) {
        //start
        result = 0;
        cin >> n;
        for (int i = 6; i <= 10; i++) {//초기화
            wormCheck[i] = false;
            wormhole[i] = { 0, };
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                cin >> map[i][j];
                if (map[i][j] >= 6 && map[i][j] <= 10) {//wormHole
                    if (wormCheck[map[i][j]] == false) {
                        wormhole[map[i][j]].x1 = i;
                        wormhole[map[i][j]].y1 = j;
                        wormCheck[map[i][j]] = true;
                    }
                    else {
                        wormhole[map[i][j]].x2 = i;
                        wormhole[map[i][j]].y2 = j;
                    }
                }
            }
        }
        for (int i = 0; i <= n + 1; i++) {//외곽 다 5로 셋팅
            map[0][i] = 5;
            map[i][0] = 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++) {
                if (map[i][j] == 0) {
                    for (int k = 0; k < 4; k++) {
                        sx = i;//start좌표 기록
                        sy = j;
                        start(i, j, k, 0);
                    }
                }
            }
        }
        cout << '#' << t << ' ' << result << '\n';
    }
}
  • 혼잣말

역시 시뮬… 집중력 조금이라도 떨어지면 망할거같아서 빡 집중했다.