https://www.acmicpc.net/problem/17281
선수 9명의 순서를 결정해야 한다. 4번 타자는 1번 선수로 고정되어 있기 때문에 이를 반영해준다.
이닝별로 선수들의 결과를 입력으로 받는다.
따라서 모든 순열을 구해서 선수들의 순서를 만들어낸 이후에, 야구의 조건을 구현해주면 된다.
1루, 2루 등에 진출해 있는 선수들에 대한 관리는, 선수 번호를 그대로 인덱스로 해서 배열을 두었다.
1이면 1루에 있다는 뜻이고, 2면 2루 3이면 3루에,
4 이상이 되면 홈으로 들어왔다는 의미이다.
각 이닝별로 선수들의 수행을 그대로 따라가면서 시뮬레이션을 진행해주면 된다.
res[][] 배열은 이닝별 선수의 득점이다.
num은 1~9까지 선수들 중에 9명을 뽑는 경우의 수로 사용한다.
ord는 뽑아서 결정된 선수들의 순서이다. ord[i]는 i번 타자를 의미한다.
#include<iostream> //2백만 #include<vector> using namespace std; int n, res[52][10], num[10], ord[10], pos[10], Max = -1; bool isused[10]; void play() { int hitter = 1, score = 0; for (int i = 1; i <= n; i++) { //i이닝에 int outCnt = 0; while (1) { if (res[i][ord[hitter]] == 0) { //아웃인 경우 hitter++; if (hitter >= 10) hitter = 1; outCnt++; if (outCnt == 3) { //이닝 교체 for (int j = 1; j <= 9; j++) pos[j] = 0; break; } } else { //득점타 for (int j = 1; j <= 9; j++) { if (pos[j] > 0 || j == ord[hitter]) { //타석에 나가 있는 선수라면 pos[j] += res[i][ord[hitter]]; if (pos[j] >= 4) { //홈에 들어오면 pos[j] = 0; score++; } } } hitter++; if (hitter >= 10) hitter = 1; } } } if (Max < score) Max = score; } void func(int k) { if (k > 9) { //base condition play(); return; } for (int i = 2; i <= 9; i++) { if (!isused[i]) { ord[k] = i; isused[i] = true; if (k == 3) func(k + 2); //3번엔 다음 4번이 아니라 5번을 정함 else func(k + 1); isused[i] = false; } } } int main(void) { for (int i = 1; i <= 9; i++) num[i] = i; isused[1] = true; //1은 항상 사용중 ord[4] = 1; // 4번 선수는 항상 1 cin >> n; for (int i = 1; i <= n; i++) for (int j = 1; j <= 9; j++) cin >> res[i][j]; func(1); cout << Max << '\n'; return 0; }
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 16235번: 나무 재테크 (C++) (0) | 2019.07.30 |
---|---|
백준 16234번: 인구 이동 (C++) (0) | 2019.07.26 |
백준 17144번: 미세먼지 안녕 (C++) (0) | 2019.07.25 |
백준 13335번: 트럭 (C++) (0) | 2019.07.25 |
백준 5014번: 스타트링크 (C++) (0) | 2019.07.24 |