본문 바로가기
알고리즘

[알고리즘] c++ cpp 야구

by keel_im 2020. 10. 7.
반응형

포인트

1. 잘 구현을 할 수 있는가?

2. 코딩 전에 설계를 할 줄 알아야 한다 

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

#include <iostream>
#include <vector>

using namespace std;

int n, answer;
int order[10];     // 타순
int map[51][10];
bool visited[10];


void game() {
    int score = 0;
    int player = 1;
    int base[4]; // base 상태

    for (int i = 1; i <= n; i++) // 총 N이닝 동안 진행
    {
        int cnt = 0;
        bool nextIning = false;
        for (int i = 0; i < 4; i++) base[i] = 0; // 베이스를 비운다.

        while (1) { // 게임
            for (int j = player; j < 10; j++) {
                int xplayer = map[i][order[j]]; // 순서가 정해진 대로 선수들이 타석으로 출전.

                if (xplayer == 0) cnt += 1; // 아웃을 치게되면 cnt 증가
                else if (xplayer == 1) // 안타를 치게되면
                {
                    for (int k = 3; k >= 1; k--) // 각 루에 있던 선수들이 한 칸씩 전진하게 된다.
                    {
                        if (base[k] == 1) {
                            if (k == 3) // 3루에 선수가 있었다면
                            {
                                base[k] = 0; // 홈으로 들어가게되고
                                score += 1;          // 점수가 1점 ++
                            } else {
                                base[k + 1] = 1; // 3루가 아닌 선수들은 1루씩 전진
                                base[k] = 0;
                            }
                        }
                    }
                    base[1] = 1;
                } else if (xplayer == 2) // 2루타도 마찬가지 원리 !
                {
                    for (int F = 3; F >= 1; F--) {
                        if (base[F] == 1) {
                            if (F == 3 || F == 2) {
                                base[F] = 0;
                                score += 1;
                            } else {
                                base[F + 2] = 1;
                                base[F] = 0;
                            }
                        }
                    }
                    base[2] = 1;
                } else if (xplayer == 3) // 3루타도 마찬가지 원리 !
                {
                    for (int S = 3; S >= 1; S--) {
                        if (base[S] == 1) {
                            base[S] = 0;
                            score += 1;
                        }
                    }
                    base[3] = 1;
                } else // 홈런일 경우
                {
                    for (int F = 1; F <= 3; F++) {
                        if (base[F] == 1) {
                            base[F] = 0;
                            score += 1; // 어떤 루에 있던 간에 무조건 홈으로 들어갈 수
                            // 있으므로 점수++
                        }
                    }
                    score += 1;
                }

                if (cnt == 3) // 3Out이 되면 그 다음 이닝으로 넘어간다.
                {
                    player = j + 1; // 다음 플레이어
                    if (player == 10) player = 1; //다시 돌아오기
                    nextIning = true; //다음 이닝으로 넘어간다.
                    break;
                }
            }
            if (nextIning) break; // 이닝 종료
            else player = 1;
        }
    }

    answer = max(answer, score);
}

void go(int cnt) { // 2번 선수 부터 차례대로 구해준다.
    if (cnt == 10) { // 10명 되면 게임 시작
        game();
        return;
    }

    for (int i = 1; i < 10; i++) {
        if (visited[i] == true) continue;
        visited[i] = true;
        order[i] = cnt;
        go(cnt + 1);
        visited[i] = false;
    }
}

int main() {

    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j < 10; j++)
            cin >> map[i][j];

    visited[4] = true;
    order[4] = 1;
    go(2);

    cout << answer << "\n";
}

 

반응형

댓글