[문제]
https://www.acmicpc.net/problem/17406
[풀이]
17406 | 맞았습니다!! | 2008 | 8 | C++14 / 수정 | 2425 | 43초 전 |
0) 조합 + 단순 반복?
1) next_permutation을 사용해서 연산 순서 조합을 구한 후에 배열을 회전시킨다.
2) 회전이 끝나면 각 행의 값을 구한다.
3) 최소값을 구한다.
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
//풀이 시간 : 40분
int n, m, k, map[51][51], ans = 987654321;
typedef pair<int, int> pp;
typedef pair<pp, int> ppp;
vector<ppp> op;
vector<int> seq;
bool visited[7];
void printMap() {
cout << '\n';
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cout << map[i][j] << " ";
}
cout << '\n';
}
cout << '\n';
}
int rotateArray() {
for (int z = 0; z < k; ++z) {
//연산 수대로 진행
int s = op[seq[z]].second;
int cycle = s;
while (cycle > 0) {
int tmp = map[r - cycle][c - cycle];
//->
for (int i = c - cycle + 1; i <= c + cycle; i++) {
int tmp2 = map[r - cycle][i];
map[r - cycle][i] = tmp;
tmp = tmp2;
}
//V
for (int i = r - cycle + 1; i <= r + cycle; i++ ) {
int tmp2 = map[i][c + cycle];
map[i][c+cycle] = tmp;
tmp = tmp2;
}
//<-
for (int i = c + cycle-1; i >= c-cycle; i--) {
int tmp2 = map[r + cycle][i];
map[r+cycle][i] = tmp;
tmp = tmp2;
}
//^
for(int i = r + cycle-1; i >= r-cycle; i--) {
int tmp2 = map[i][c-cycle];
map[i][c-cycle] = tmp;
tmp = tmp2;
}
cycle--;
}
// printMap();
}
int res = 987654321, sum = 0;
for (int i = 1; i <= n; ++i) {
sum = 0;
for (int j = 1; j <= m; ++j) {
sum += map[i][j];
}
res = min(sum, res);
}
return res;
}
// void dfs(int cnt, int cur) {
// if (cnt == op.size()) {
// for (int i = 0; i < seq.size(); i++) {
// cout << seq[i] << '\n';
// }
// int res = rotateArray();
// ans = min(res, ans);
// return;
// }
// visited[cur] = true;
// seq.push_back(cur);
// dfs(cnt+1, cur+1 );
// visited[cur] = false;
// seq.pop_back();
// // for (int i = cur; i < op.size(); ++i) {
// // if (!visited[i]) {
// // visited[i] = true;
// // seq.push_back(i);
// // dfs(cnt+1, cur+1);
// // seq.pop_back();
// // visited[i] = false;
// // }
// // }
// }
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> map[i][j];
}
}
for (int i = 0; i < k; ++i) {
int a, b, c;
cin >> a >> b >> c;
op.push_back(ppp(pp(a, b), c));
seq.push_back(i);
}
//input
// dfs(0,0);
//연산 순서를 정한다.
do {
int c_map[51][51];
memcpy(c_map, map, sizeof(map));
ans = min(ans, rotateArray());
memcpy(map, c_map, sizeof(map));
} while(next_permutation(seq.begin(), seq.end()));
cout << ans << '\n';
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'BOJ > C++' 카테고리의 다른 글
[BOJ] 색종이 붙이기 (0) | 2019.09.06 |
---|---|
[BOJ] 사다리조작 (0) | 2019.08.28 |
[BOJ] 안전영역 (0) | 2019.08.16 |
[BOJ] 분수의 합 (0) | 2019.08.09 |
[BOJ] 플로이드 (0) | 2019.08.09 |