https://www.acmicpc.net/problem/17406
ํ... ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ์ ๋ํ์์ด๋ค. ์์ด + ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ๊ฐ ํฉ์ณ์ง ๋ฌธ์ ์ด๋ค.
์ฐ์ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ด ๋ค์ด์ฌ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐฐ์ด์ ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์์ด์ ๋๋ฆฐ๋ค. ์์ด์ ์ ์ฅํ๊ธฐ ์ํ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ง๋ค์ด์คฌ๋ค.
์์ด์ด ์์ฑ์ด ๋๋ฉด, ๋ฐฐ์ด์ ๋๋ ค์ค๋ค.
๋ฐฐ์ด์ ๋๋ฆฌ๋๋ฐ ๋ฐฉํฅ๋ณ๋ก for๋ฌธ์ ๋๋ ค์ ์ฎ๊ฒจ์ฃผ์๋ค. ๋จผ์ ํ๋ ๊ฒ์ ๋ฐ์๊ณ์๋๋ฐ, ์ด๋ฒ ๊ฒ์ ์๊ณ๋ผ์ ์ฒ์์ ์๋ชป ํ์๋ค.. ์ธ๋ฑ์ค์ ์ ์ํด์ผ ํ๋ค.
์ค๊ฐ์ ํ๋ ธ๋๋ฐ ์์ด์ด ํ๋ ์์ฑ๋ ๋๋ง๋ค ๋ฆฌํดํ๊ธฐ ์ ์ ์๋ ๋ฐฐ์ด๋ก ๋๋ ค๋์์ผ ํ๋ค.
์ด๊ธฐํ!!!!!!!
์๋๋ ค ๋์ผ๋ฉด ์ฐ์ฐ์ด ์ํ๋ ๊ฒ์ ์ด์ด์ ์ํ์ด ๋๋ค.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, K;
static int[][] A;
static int[][] A_copy;
static boolean[] visited;
static Operation[] ops;
static Operation[] result;
static int min = Integer.MAX_VALUE;
static class Operation {
int r;
int c;
int s;
public Operation(int r, int c, int s) {
this.r = r;
this.c = c;
this.s = s;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
A = new int[N + 1][M + 1];
A_copy = new int[N + 1][M + 1];
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 1; j <= M; j++) {
A[i][j] = A_copy[i][j] = Integer.parseInt(st.nextToken());
}
}
ops = new Operation[K];
for(int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine(), " ");
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
ops[i] = new Operation(r, c, s);
}
//์ฐ์ฐ์ ๋ํด ์์ด
visited = new boolean[K];
result = new Operation[K];
permutation(0);
//์ถ๋ ฅ
System.out.println(min);
}
public static void permutation(int count) {
if(count == K) {
for(int i = 0; i < K; i++) {
rotate(result[i].r, result[i].c, result[i].s);
}
int a = Integer.MAX_VALUE;
for(int i = 1; i <= N; i++) { //๋ฐฐ์ด A์ ๊ฐ ๊ตฌํ๊ธฐ
int sum = 0;
for(int j = 1; j <= M; j++) {
sum += A[i][j];
}
a = Math.min(a, sum);
}
min = Math.min(min, a); //A๊ฐ์ ์ต์๊ฐ ๊ฐฑ์
//๋ฐฐ์ด A ์๋ณธ์ผ๋ก ๋๋๋ ค๋๊ธฐ
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= M; j++) {
A[i][j] = A_copy[i][j];
}
}
return;
}
for(int i = 0; i < K; i++) {
if(visited[i]) continue;
visited[i] = true;
result[count] = ops[i];
permutation(count + 1);
visited[i] = false;
}
}
public static void rotate(int r, int c, int s) {
int depth = (s * 2 + 1) / 2;
for(int d = 0; d < depth; d++) {
int tmp = A[r - s + d][c - s + d];
for(int i = r - s + d; i < (r + s - d); i++) { // ↑
A[i][c - s + d] = A[i + 1][c - s + d];
}
for(int i = c - s + d; i < (c + s - d); i++) { // ←
A[r + s - d][i] = A[r + s - d][i + 1];
}
for(int i = (r + s - d); i >= (r - s + d + 1); i--) { // ↓
A[i][c + s - d] = A[i - 1][c + s - d];
}
for(int i = (c + s - d); i >= (c - s + d + 1); i--) { // →
A[r - s + d][i] = A[r - s + d][i - 1];
}
A[r - s + d][c - s + d + 1] = tmp;
}
}
}
๊ฒฐ๊ณผ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
14889๋ฒ - ์คํํธ์ ๋งํฌ (0) | 2022.08.16 |
---|---|
๋ฐฑ์ค 2961๋ฒ - ๋์์ด๊ฐ ๋ง๋ ๋ง์๋ ์์ (0) | 2022.08.16 |
1213๋ฒ - ํฐ๋ฆฐ๋๋กฌ ๋ง๋ค๊ธฐ (0) | 2022.08.11 |
๋ฐฑ์ค 3040๋ฒ - ๋ฐฑ์ค ๊ณต์ฃผ์ ์ผ๊ณฑ ๋์์ด (0) | 2022.08.11 |
๋ฐฑ์ค 16922๋ฒ - ๋ก๋ง ์ซ์ ๋ง๋ค๊ธฐ (0) | 2022.08.11 |