아무코딩

[백준 17281] 야구 본문

알고리즘/백준

[백준 17281] 야구

동 코 2020. 5. 12. 00:05

 

문제풀이

 

시뮬레이션 문제이다. 순열을 만드는 방법은 next_permutation() 을 써도 되지만 여기서는 그냥 dfs를 이용하여 순열을 생성하였다.

 

순열을 생성하여 타순을 매번 정하여 해당 타순을 기준으로 점수를 산출한다. 

 

출루는 베이스에 1을 추가한뒤 배열을 미는 방식으로 점수를 산출한다. 1루이동을 매루에 적용하여 재사용하였다.

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
 
int n_inning;
int Select[10];
int score[51][10];
int order[10];
vector<int> perm;
int base[5];
int total_score=0;
int max_score = -1;
 
void advance();
void Game();
void permutation(int cnt);
int main() {
 
    //freopen("input.txt", "r", stdin);
    scanf("%d"&n_inning);
    for (int i = 1; i <=n_inning; i++) {
        for (int j = 1; j <=9; j++) {
            scanf("%d"&score[i][j]);
        }
    }
    Select[4= 1;
    order[4= 1;
    permutation(2);
    printf("%d\n", max_score);
    
}
void advance() {
    for (int i = 3; i >= 0; i--) {
        base[i + 1= base[i];
    }
    if (base[4== 1) {
        base[4= 0;
        total_score++;
    }
    base[0= 0;
}
void Game() {
    int inning = 1;
    int out_cnt = 0;
    int play_order = 1;
    memset(base, 0sizeof(base));
    while (1) {
        //printf("%3d이닝 %3d 아웃 현재점수(%3d) %3d번타자 (등번호%3d):",inning,out_cnt,total_score, play_order, order[play_order], score[inning][order[play_order]]);
        if (inning > n_inning) {
            //종료조건
        //    printf("score : %d\n", total_score);
            return;
        }
        int player_score = score[inning][order[play_order]];
        if (player_score == 0) {
        //    printf("아웃\n");
            out_cnt++;
 
        }
        else {
        //    printf("%d루타\n", score[inning][order[play_order]]);
            base[0= 1;//베이스에 사람한명세우기
            for (int i = 0; i < player_score; i++) {
                advance();//진루
            }
            //base[score[inning][order[play_order]]] = 1;
        }
        if (out_cnt == 3) {//삼진아웃.
            out_cnt = 0;
            inning++;
            memset(base, 0sizeof(base));
        }
        play_order = play_order % 9 + 1;//다음선수
 
    }
 
}
void permutation(int cnt) {
    if (cnt == 10) {
        total_score = 0;
        Game();
        max_score = max(max_score, total_score);
        return;
    }
    for (int i = 1; i < 10; i++) {
        if (Select[i] == 1)
            continue;
        Select[i] = 1;
        order[i] = cnt;
        permutation(cnt + 1);
        Select[i] = 0;
    }
}
 
cs
 

문제 링크 : www.acmicpc.net/problem/17281

 

17281번: ⚾

⚾는 9명으로 이루어진 두 팀이 공격과 수비를 번갈아 하는 게임이다. 하나의 이닝은 공격과 수비로 이루어져 있고, 총 N이닝동안 게임을 진행해야 한다. 한 이닝에 3아웃이 발생하면 이닝이 종료되고, 두 팀이 공격과 수비를 서로 바꾼다. 두 팀은 경기가 시작하기 전까지 타순(타자가 타석에 서는 순서)을 정해야 하고, 경기 중에는 타순을 변경할 수 없다. 9번 타자까지 공을 쳤는데 3아웃이 발생하지 않은 상태면 이닝은 끝나지 않고, 1번 타자가 다시 타석에

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 2623] 음악프로그램 (java)  (0) 2020.05.18
[백준 2352] 반도체 설계  (0) 2020.05.15
[백준 2580] 스도쿠  (0) 2020.05.11
[백준 1300] k번째수  (0) 2020.05.08
[백준 2252] 줄세우기  (0) 2020.05.08
Comments