#17281. ⚾
Problem
Solution
시뮬레이션 문제이다. 문제의 설명에 맞게 잘 구현하면 큰 어려움은 없는 문제
- 타자의 순번을 정한다. (1번 선수는 4번 타자로 고정) → (1, 2, 3)과 (2, 1, 3)은 다른 순서임
- 1이닝부터 N이닝까지 경기를 진행한다.
- 각 이닝별 진행 흐름
- 이전 순번 바로 다음부터 순번이 진행된다. (첫 이닝은 1번부터(인덱스상 0))
- 아웃이 3번이 될 때까지 진행한다.
- 1루, 2루, 3루에 선수가 있는지 표시하는
is_there
변수를 사용하여 진행한다.
1 Try
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
| #include <iostream> using namespace std; int N, ans; int info[50][9]; int order[9]; bool selected[9]; void Game() { int idx = 0, score = 0; for(int inning = 0; inning < N; ++inning) { bool is_there[3] = { false, false, false }; int out = 0; while (true) { if (info[inning][order[idx]] == 0) { out++; } else if (info[inning][order[idx]] == 1) { if (is_there[2]) { score++; is_there[2] = false; } for (int i = 1; i != -1; --i) { if (is_there[i]) { is_there[i + 1] = true; is_there[i] = false; } } is_there[0] = true; } else if (info[inning][order[idx]] == 2) { for (int i = 1; i < 3; ++i) { if (is_there[i]) { score++; is_there[i] = false; } } if (is_there[0]) { is_there[2] = true; is_there[0] = false; } is_there[1] = true; } else if (info[inning][order[idx]] == 3) { for (int i = 0; i < 3; ++i) { if (is_there[i]) { score++; is_there[i] = false; } } is_there[2] = true; } else { for (int i = 0; i < 3; ++i) { if (is_there[i]) { score++; is_there[i] = false; } } score++; } idx = (idx + 1) % 9; if (out == 3) break; } } if (ans < score) ans = score; } void SelectOrder(int cnt) { if (cnt == 9) { Game(); return; } if (cnt == 3) cnt++; for (int i = 1; i < 9; ++i) { if (selected[i]) continue; selected[i] = true; order[cnt] = i; SelectOrder(cnt + 1); selected[i] = false; } } int main() { cin >> N; for (int i = 0; i < N; ++i) { for (int j = 0; j < 9; ++j) { cin >> info[i][j]; } } selected[0] = true; order[3] = 0; SelectOrder(0); cout << ans << "\n"; return 0; }
|