728x90
https://www.acmicpc.net/problem/17281
뚝심있게 완전탐색 하면 되는 문제였다.
모든 타석의 순번 인덱스에 대한 경우의 수를 순열 구하는 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, false, sizeof(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 == true) break;
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] == true) continue;
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
'PS > 백준' 카테고리의 다른 글
[백준 17406번] 배열 돌리기 4 c++ (0) | 2021.05.16 |
---|---|
[백준 17471번] 게리맨더링 C++ (0) | 2021.05.16 |
[백준 17070번] 파이프 옮기기 1 C++ (0) | 2021.05.14 |
[백준 2156번] 포도주 시식 c++ (0) | 2021.05.13 |
[백준 10844번] 쉬운 계단 수 C++ (0) | 2021.05.13 |