문제 풀이
[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<int, int>> 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 |