https://www.acmicpc.net/problem/17406
17406๋ฒ: ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4
ํฌ๊ธฐ๊ฐ NรM ํฌ๊ธฐ์ธ ๋ฐฐ์ด A๊ฐ ์์๋, ๋ฐฐ์ด A์ ๊ฐ์ ๊ฐ ํ์ ์๋ ๋ชจ๋ ์์ ํฉ ์ค ์ต์๊ฐ์ ์๋ฏธํ๋ค. ๋ฐฐ์ด A๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ 1ํ์ ํฉ์ 6, 2ํ์ ํฉ์ 4, 3ํ์ ํฉ์ 15์ด๋ค. ๋ฐ๋ผ์, ๋ฐฐ์ด A์
www.acmicpc.net
ํ... ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ์ ๋ํ์์ด๋ค. ์์ด + ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ๊ฐ ํฉ์ณ์ง ๋ฌธ์ ์ด๋ค.
์ฐ์ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ด ๋ค์ด์ฌ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐฐ์ด์ ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์์ด์ ๋๋ฆฐ๋ค. ์์ด์ ์ ์ฅํ๊ธฐ ์ํ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ง๋ค์ด์คฌ๋ค.
์์ด์ด ์์ฑ์ด ๋๋ฉด, ๋ฐฐ์ด์ ๋๋ ค์ค๋ค.
๋ฐฐ์ด์ ๋๋ฆฌ๋๋ฐ ๋ฐฉํฅ๋ณ๋ก 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 |
https://www.acmicpc.net/problem/17406
17406๋ฒ: ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4
ํฌ๊ธฐ๊ฐ NรM ํฌ๊ธฐ์ธ ๋ฐฐ์ด A๊ฐ ์์๋, ๋ฐฐ์ด A์ ๊ฐ์ ๊ฐ ํ์ ์๋ ๋ชจ๋ ์์ ํฉ ์ค ์ต์๊ฐ์ ์๋ฏธํ๋ค. ๋ฐฐ์ด A๊ฐ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ 1ํ์ ํฉ์ 6, 2ํ์ ํฉ์ 4, 3ํ์ ํฉ์ 15์ด๋ค. ๋ฐ๋ผ์, ๋ฐฐ์ด A์
www.acmicpc.net
ํ... ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ์ ๋ํ์์ด๋ค. ์์ด + ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ๊ฐ ํฉ์ณ์ง ๋ฌธ์ ์ด๋ค.
์ฐ์ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐ์ด ๋ค์ด์ฌ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฐฐ์ด์ ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์์ด์ ๋๋ฆฐ๋ค. ์์ด์ ์ ์ฅํ๊ธฐ ์ํ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ง๋ค์ด์คฌ๋ค.
์์ด์ด ์์ฑ์ด ๋๋ฉด, ๋ฐฐ์ด์ ๋๋ ค์ค๋ค.
๋ฐฐ์ด์ ๋๋ฆฌ๋๋ฐ ๋ฐฉํฅ๋ณ๋ก 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 |