본문 바로가기

PS/백준

[백준 17281번] ⚾(야구) C++

728x90

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

 

17281번: ⚾

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

www.acmicpc.net

 

뚝심있게 완전탐색 하면 되는 문제였다.

모든 타석의 순번 인덱스에 대한 경우의 수를 순열 구하는 DFS를 만들어서 구현했다.

순열 구하는 코드는 https://yabmoons.tistory.com/100 형님 글 참고..

 

그 후 게임을 플레이 하는 함수를 구현했다

 

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
 
int n;
int arr[51][10];
int order[9];
bool selec[10];
int maxsum = 0;
 
 
 
//sumscore() 상태는 이미 모든 순열이 v[0]~v[8]에 들어있는 상태
void sumscore() {
    int score = 0;
    int start_player = 0;
    bool next;
    bool base[4];
    //base[0]은 홈, base[3]은 3루
 
    //n이닝동안 진행
    for (int e = 0; e < n; e++) {
        int outcount = 0;
        next = false;
        memset(base, falsesizeof(base));
 
        while (1) {
            for (int i = start_player; i < 9; i++) {
 
                int player = arr[e][order[i]];
 
                if (player == 0) outcount++;
                //안타쳤을때
                else if (player == 1) {
                    for (int x = 3; x > 0; x--) {
                        if (base[x] == true) {
                            if (x == 3) {
                                base[x] = false;
                                score++;
                            }
                            else {
                                base[x + 1= true;
                                base[x] = false;
                            }
                        }
                    }
                    base[1= true;
                }
                //2루타 쳤을때
                else if (player == 2) {
                    for (int x = 3; x > 0; x--) {
                        if (base[x] == true) {
                            if (x == 3 || x == 2) {
                                score++;
                                base[x] = false;
                            }
                            else {
                                base[x + 2= true;
                                base[x] = false;
                            }
                        }
                    }
                    base[2= true;
                }
                //3루타 쳤을때
                else if (player == 3) {
                    for (int x = 3; x > 0; x--) {
                        if (base[x] == true) {
                            score++;
                            base[x] = false;
                        }
                    }
                    base[3= true;
                }
                //홈런 쳤을때
                else
                {
                    for (int x = 3; x > 0; x--) {
                        if (base[x] == true) {
                            score++;
                            base[x] = false;
                        }
                    }
                    score++;
                }
                if (outcount == 3) {
                    start_player = i + 1;
                    if (start_player == 9) start_player = 0;
                    next = true;
                    break;
 
                }
            }//선수 반복문
            if (next == truebreak;
            start_player = 0;
        }//와일 반복문
    }//이닝 반복문
 
    maxsum = max(maxsum, score);
}
 
void dfs(int cnt) {
 
    if (cnt == 9) {
        sumscore();
        return;
    }
    for (int i = 0; i < 9; i++) {
        if (selec[i] == truecontinue;
        selec[i] = true;
        order[i] = cnt;
 
        dfs(cnt + 1);
 
        selec[i] = false;
    }
}
int main() {
    cin >> n;
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < 9; j++)
            cin >> arr[i][j];
    selec[3= true;
    order[3= 0;
    dfs(1);
 
    cout << maxsum;
 
    return 0;
 
}
 
 
 
 
 
cs
728x90