[문제 링크] : https://www.acmicpc.net/problem/17406
#include <iostream>
using namespace std;
int N, M, K;
int Ans = 1234567890;
int Arr[51][51];
int Tmp[51][51];
int Cal[6][3];
bool Check[6];
int Order[6];
int calc(){
int res = 1234567890;
for(int i=1; i<=N; i++){
int sum = 0;
for(int j=1; j<=M; j++){
sum += Tmp[i][j];
}
res = min(res, sum);
}
return res;
}
void rotate(){
for(int o=0; o<K; o++){
int y = Cal[Order[o]][0];
int x = Cal[Order[o]][1];
int s = Cal[Order[o]][2];
for(int i=1; i<=s; i++){
int LT = Tmp[y - i + 1][x - i];
int RT = Tmp[y - i][x + i - 1];
int LB = Tmp[y + i][x - i + 1];
int RB = Tmp[y + i - 1][x + i];
for(int j=x+i-1; j>x-i; j--){
Tmp[y - i][j] = Tmp[y - i][j - 1];
}
for(int j=x-i+1; j<x+i; j++){
Tmp[y + i][j] = Tmp[y + i][j + 1];
}
for(int j=y-i+1; j<y+i; j++){
Tmp[j][x - i] = Tmp[j + 1][x - i];
}
for(int j=y+i-1; j>y-i; j--){
Tmp[j][x + i] = Tmp[j - 1][x + i];
}
Tmp[y - i][x - i] = LT;
Tmp[y - i][x + i] = RT;
Tmp[y + i][x - i] = LB;
Tmp[y + i][x + i] = RB;
}
}
return;
}
void solve(int n){
if(n == K){
for(int i=1; i<=N; i++){
for(int j=1; j<=M; j++){
Tmp[i][j] = Arr[i][j];
}
}
rotate();
int val = calc();
Ans = min(Ans, val);
return;
}
for(int i=0; i<K; i++){
if(Check[i] == false){
Check[i] = true;
Order[n] = i;
solve(n + 1);
Check[i] = false;
}
}
return;
}
int main(){
cin >> N >> M >> K;
for(int i=1; i<=N; i++){
for(int j=1; j<=M; j++){
cin >> Arr[i][j];
}
}
for(int i=0; i<K; i++){
cin >> Cal[i][0] >> Cal[i][1] >> Cal[i][2];
}
solve(0);
cout << Ans << "\n";
return 0;
}
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 22864 - 피로도 (C++) (0) | 2025.01.29 |
---|---|
[알고리즘] 백준 26307 - Correct (C++) (0) | 2025.01.28 |
[알고리즘] 백준 3020 - 개똥벌레 (C++) (0) | 2025.01.26 |
[알고리즘] 백준 16637 - 괄호 추가하기 (C++) (0) | 2025.01.25 |
[알고리즘] 백준 17472 - 다리 만들기 2 (C++) (0) | 2025.01.23 |