알고리즘/시뮬레이션 & 구현

[백준/구현/C++] 17281번 야구*

데메즈 2023. 2. 7. 09:35
728x90
반응형

https://www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝 동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종

www.acmicpc.net

#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
반응형