728x90
반응형
https://www.acmicpc.net/problem/17281
#include <bits/stdc++.h>
#define MAX 51
#define PLAYER_NUM 10
using namespace std;
int N, answer;
int Order[PLAYER_NUM];
int Game[MAX][PLAYER_NUM];
bool selected[PLAYER_NUM];
vector<int> v;
void play_the_game(){
int score = 0;
int start_player = 1;
int base_state[4]; // 0:홈, 1:1루, 2:2루, 3:3루
for(int i=1; i<=N; i++){
int out_cnt = 0;
bool Next_Ining = false;
memset(base_state, 0, sizeof(base_state));
while(1){
for(int j=start_player; j<PLAYER_NUM;j++){
int player = Game[i][Order[j]];
if(player == 0) out_cnt++; // 아웃인 경우
else if(player == 1){ // 안타인 경우
for(int f = 3; f>=1; f--){ // 한칸씩 전진
if(base_state[f] == 1){
if(f == 3){ // 3루에 선수가 있는경우
base_state[f] = 0; // 홈으로 들어가고
score++; // 점수+1
} else {
base_state[f+1] = 1; // 3루가아닌 선수들 1루씩 전진
base_state[f] = 0;
}
}
}
base_state[1] = 1;
} else if(player == 2){ // 2루타 치는 경우
for(int f=3; f>=1; f--){
if(base_state[f] == 1){
if(f == 3 || f == 2){
base_state[f] = 0;
score++;
} else {
base_state[f+2] = 1;
base_state[f] = 0;
}
}
}
base_state[2] = 1;
} else if(player == 3){ // 3루타치는 경우
for(int f = 3; f>=1; f--){
if(base_state[f] == 1){
base_state[f] = 0;
score++;
}
}
base_state[3] = 1;
} else { // 홈런일 경우
for(int f=1; f<=3; f++){
if(base_state[f] == 1){
base_state[f] = 0;
score++;
}
}
score++;
}
if(out_cnt == 3){ // 3아웃인 경우
start_player = j+1;
if(start_player == PLAYER_NUM) start_player =1;
Next_Ining = true;
break;
}
}
if(Next_Ining == true) break;
start_player = 1;
}
}
answer = max(answer, score);
}
void dfs(int cnt){
if(cnt == PLAYER_NUM){
play_the_game();
return;
}
for(int i=1; i<PLAYER_NUM; i++){
if(selected[i] == true) continue;
selected[i] =true;
Order[i] = cnt;
dfs(cnt+1);
selected[i] = false;
}
}
void input(){
cin >> N;
for(int i=1; i<=N; i++){
for(int j=1; j<PLAYER_NUM; j++){
cin >> Game[i][j];
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
selected[4] = true; // 4번타자는 이미 고름
Order[4] = 1; // 4번타자는 1번
dfs(2); // 순열구현
cout << answer;
return 0;
}
728x90
반응형
'알고리즘 > 시뮬레이션 & 구현' 카테고리의 다른 글
[백준/구현/C++] 11659번 구간 합 구하기 4 (2) | 2023.02.20 |
---|---|
[백준/구현/백트래킹/C++] 17406번 배열 돌리기 4 (삼성 코딩테스트) (0) | 2023.02.08 |
[백준/구현/C++] 15685번 드래곤 커브 * (0) | 2023.01.27 |
[백준/구현/C++] 14499번 주사위 굴리기 (삼성 SW 역량 테스트 기출) (0) | 2023.01.23 |
[백준/구현/C++] 21610번 마법사 상어와 비바라기 (삼성 SW 역량 테스트 기출) (0) | 2023.01.22 |