문제 : https://www.acmicpc.net/problem/17281
[ 알고리즘풀이 ]
1. Backtracking 을 이용해 가능한 모든 타순에 대해서 게임을 진행합니다. ( 이때, 1번 선수는 4번 타자로 선발된 경우만 게임을 진행합니다. )
2. 게임은 N 이닝 동안 현재 주자 상태와 현재 타석에 있는 타자의 결과에 따라서 score를 계산해주면 됩니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, result[50][9] = {}, ans = -1;
int startGame(vector<int> batting) {
int score = 0, batter = 0, out = 0;
for (int i = 0; i < N; i++) {
out = 0;
bool runner[3] = {};
while (out < 3) {
if (result[i][batting[batter]] == 0)
out++;
else {
// 기존에 있던 주자들
for (int j = 2; j >= 0; j--) {
if(runner[j]){
if (j + result[i][batting[batter]] >= 3)
score++;
else
runner[j + result[i][batting[batter]]] = true;
runner[j] = false;
}
}
// 타자
if (result[i][batting[batter]] == 4)
score++;
else
runner[result[i][batting[batter]] - 1] = true;
}
batter = (batter + 1) % 9;
}
}
return score;
}
void backTracking(vector<int> batting, bool check[9]) {
if (batting.size() == 9) {
if(batting[3] == 0)
ans = max(ans, startGame(batting));
return;
}
for(int i = 0; i < 9; i++)
if (!check[i]) {
batting.push_back(i);
check[i] = true;
backTracking(batting, check);
check[i] = false;
batting.pop_back();
}
return;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> N;
for (int i = 0; i < N; i++)
for (int j = 0; j < 9; j++)
cin >> result[i][j];
vector<int> batting;
bool check[9] = {};
for (int i = 0; i < 9; i++) {
batting.push_back(i);
check[i] = true;
backTracking(batting, check);
check[i] = false;
batting.pop_back();
}
cout << ans;
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 2565 : 전깃줄 - travelbeeee (0) | 2020.02.16 |
---|---|
[BOJ] 1059 : 수2 - travelbeeee (0) | 2020.02.14 |
[BOJ] 1049 : 기타줄 - travelbeeee (0) | 2020.02.13 |
[BOJ] 17218 : 비밀번호 만들기 - travelbeeee (0) | 2020.02.13 |
[BOJ] 17219 : 비밀번호 찾기 - travelbeeee (0) | 2020.02.13 |