-
[SWEA 5650] 핀볼 게임C 프로그래밍/SWEA 2022. 10. 5. 20:43728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo
#include <cstdio> #include <cstring> int T; int N; int board[100 + 2][100 + 2]; int ans; struct _wt { int x, y; }WH[10 + 2][2]; int Blocks[6][4] = { {}, // 0상 1하 2좌 3우 {1, 3, 0, 2}, //1 {3, 0, 1, 2}, //2 {2, 0, 3, 1}, //3 {1, 2, 3, 0}, //4 {1, 0, 3, 2} //5 }; void input() { // init memset(board, 0, sizeof(board)); memset(WH, 0, sizeof(WH)); ans = 0; scanf("%d", &N); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &board[i][j]); if (board[i][j] >= 6) { if (WH[board[i][j]][0].x == 0 && WH[board[i][j]][0].y == 0) WH[board[i][j]][0] = { i, j }; else WH[board[i][j]][1] = { i, j }; } } } } void make_bound() { for (int i = 0; i <= N + 1; i++) { board[0][i] = 5; board[N + 1][i] = 5; board[i][0] = 5; board[i][N + 1] = 5; } } int play_game(int sx, int sy, int d) { // dir // 0상 1하 2좌 3우 int dir_x[4] = { -1, 1, 0, 0 }; int dir_y[4] = { 0, 0 , -1, 1 }; int x = sx; int y = sy; int score = 0; while (1) { int nx = x + dir_x[d]; int ny = y + dir_y[d]; if (nx == sx && ny == sy) return score; // 블랙홀 만났을 때 if (board[nx][ny] == -1) return score; // 블럭만났을 때 else if (board[nx][ny] >= 1 && board[nx][ny] <= 5) { score++; int nd = Blocks[board[nx][ny]][d]; x = nx, y = ny; d = nd; continue; } // 웜홀 만났을 때 else if (board[nx][ny] >= 6) { if (nx == WH[board[nx][ny]][0].x && ny == WH[board[nx][ny]][0].y) { x = WH[board[nx][ny]][1].x; y = WH[board[nx][ny]][1].y; continue; } else { x = WH[board[nx][ny]][0].x; y = WH[board[nx][ny]][0].y; continue; } } // 빈칸일 때 else { x = nx, y = ny; } } } void search_all() // 모든 칸에서 시작해본다. { for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (board[i][j] != 0) continue; // 블럭, 블랙홀, 웜홀에서는 시작하지 않음 for (int p = 0; p < 4; p++) { // 같은 출발점에서 4방향으로 시작해봄 int res = play_game(i, j, p); if (res > ans) ans = res; } } } } int main() { scanf("%d", &T); for (int t = 1; t <= T; t++) { input(); make_bound(); search_all(); printf("#%d %d\n", t, ans); } return 0; }
주의해야 하는 포인트들
1. 웜홀 좌표 저장 시, 같은 열 혹은 같은 행에 있는 경우 있을 수 있다.
따라서 x좌표 혹은 y좌표 한 개만 확인해주는 것이 아니라, 둘 다 확인해 주어야 한다.
2. ans 초기화
맵에 빈칸이 아예 없어서 play_game() 함수를 호출하지 못하는 경우가 있을 수 있다.
이 경우 ans 값을 -1로 초기화 한 경우 0으로 바뀌지 않기 때문에 -1 이라는 틀린 값을 출력한다.
특정 변수를 초기화할 때, 어떤 값으로 초기화해야하는지 항상 생각하면서 문제를 풀자 .
728x90'C 프로그래밍 > SWEA' 카테고리의 다른 글
[SWEA 6808] 규영이와 인영이의 카드게임 (0) 2022.11.04 [SWEA 5653] 줄기세포 배양 (0) 2022.10.15 [SWEA 2112] 보호 필름 (0) 2022.10.12 [SWEA 1953] 탈주범 검거 (0) 2022.10.11 [SWEA 1954] 달팽이 숫자 (0) 2022.08.18