Study hard
(c++)백준 17406번: 배열 돌리기 4 본문
17406번: 배열 돌리기 4
크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의
www.acmicpc.net
[풀이]
dfs 순열 구하는 방법을 이용하여 회전 연산 순서를 정했다.
※r, c가 1부터 시작한다는 것 유의
회전 연산은 값 하나를 tmp에 저장해놓고 for문을 돌리는 방식으로 구현했다.
#include <iostream>
#include <algorithm>//min
#include <vector>
using namespace std;
struct Roll {
int r, c, s;
};
int N, M, K;
int A[51][51];
int c_A[51][51];//시뮬레이션 돌릴 복사본
vector<Roll>Op;
int Order[6];//회전연산 순서
bool check[6];//선택한 회전연산 표시
int Min = 987654321;
void Rolling(int r, int c, int s) {
for (int d = 1; d <= s; d++) {
int tmp = c_A[r - d][c - d];
//왼쪽변
for (int i = r - d + 1; i <= r + d; i++) {
c_A[i - 1][c - d] = c_A[i][c - d];
}
//아래쪽변
for (int i = c - d + 1; i <= c + d; i++) {
c_A[r + d][i - 1] = c_A[r + d][i];
}
//오른쪽변
for (int i = r + d - 1; i >= r - d; i--) {
c_A[i + 1][c + d] = c_A[i][c + d];
}
//위쪽변
for (int i = c + d - 1; i > c - d; i--) {
c_A[r - d][i + 1] = c_A[r - d][i];
}
c_A[r - d][c - d + 1] = tmp;
}
}
void Simul() {
int res = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
c_A[i][j] = A[i][j];
}
}
//정해진 순서대로 회전연산 수행
for (int i = 0; i < K; i++) {
int od = Order[i];
int r = Op[od].r;
int c = Op[od].c;
int s = Op[od].s;
Rolling(r, c, s);
}
for (int k = 1; k <= N; k++) {
for (int j = 1; j <= M; j++) {
res += c_A[k][j];
}
Min = min(Min, res);
res = 0;
}
}
void dfs(int cnt) {
if (cnt == K) {
Simul();
return;
}
for (int i = 0; i < K; i++) {
if (check[i] == true)
continue;
check[i] = true;
Order[cnt] = i;
dfs(cnt + 1);
check[i] = false;
}
}
void solution() {
cin >> N >> M >> K;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> A[i][j];
}
}
for (int i = 0; i < K; i++) {
int r, c, s;
cin >> r >> c >> s;
Op.push_back({ r,c,s });
}
dfs(0);
cout << Min << '\n';
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
solution();
return 0;
}
'백준 > bfs, dfs' 카테고리의 다른 글
(c++)백준 15683번: 감시 (0) | 2020.10.15 |
---|---|
(c++)백준 19238번: 스타트 택시 (0) | 2020.10.14 |
(c++)백준 17281번: ⚾ (0) | 2020.10.12 |
(c++)백준 17136번: 색종이 붙이기 (0) | 2020.10.12 |
(c++)백준 17145번: 캐슬 디펜스 (0) | 2020.10.12 |