-
[BOJ] 배열 돌리기 4Algorithm/BOJ 2020. 2. 8. 15:24
[17405] 배열 돌리기 4
https://www.acmicpc.net/problem/17406
- 배열 A와 사용 가능한 회전 연산이 주어졌을 때, 배열 A의 값의 최솟값을 구하는 문제
- 회전 연산은 모두 한 번씩 사용해야 하며, 순서는 임의로 정해도 된다.
Solution
- permuation() 함수를 돌려 회전 순서를 바꿔가면서 simulation한다.
- 어렵다 T.T
소스코드
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.StringTokenizer; public class Main { static int n, m, k, min = Integer.MAX_VALUE; static int[] dx = { 1, 0, -1, 0 }; static int[] dy = { 0, 1, 0, -1 }; static int[][] origin; static int[][] copy; static int[] list; static boolean[] c; static List<Node> nodeList; static class Node { int r, c, s; public Node(int r, int c, int s) { this.r = r; this.c = c; this.s = s; } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); StringTokenizer st = new StringTokenizer(sc.nextLine()); n = stoi(st.nextToken()); m = stoi(st.nextToken()); k = stoi(st.nextToken()); origin = new int[n + 1][m + 1]; copy = new int[n + 1][m + 1]; for (int i = 1; i <= n; i++) { st = new StringTokenizer(sc.nextLine()); for (int j = 1; j <= m; j++) { origin[i][j] = stoi(st.nextToken()); } } nodeList = new ArrayList<>(); for (int i = 0; i < k; i++) { st = new StringTokenizer(sc.nextLine()); nodeList.add(new Node(stoi(st.nextToken()), stoi(st.nextToken()), stoi(st.nextToken()))); } list = new int[k]; c = new boolean[k]; permutation(0, 0); System.out.println(min); } private static void print() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { System.out.print(copy[i][j] + " "); } System.out.println(); } System.out.println("-------------"); } public static void rotate(int x, int y, int s) { for (int i = 1; i <= s; i++) { int sx = x - i; int sy = y - i; int value = copy[sx][sy]; int dir = 0; while (dir < 4) { int nx = sx + dx[dir]; int ny = sy + dy[dir]; if (nx >= x - i && ny >= y - i && nx <= x + i && ny <= y + i) { copy[sx][sy] = copy[nx][ny]; sx = nx; sy = ny; } else { dir++; } } copy[x - i][y - i + 1] = value; } } public static void simulation() { copyArray(); for (int i : list) { rotate(nodeList.get(i).r, nodeList.get(i).c, nodeList.get(i).s); } min = Math.min(min, calc()); } public static void permutation(int depth, int start) { if (depth == k) { simulation(); return; } for (int i = 0; i < k; i++) { if (!c[i]) { c[i] = true; list[depth] = i; permutation(depth + 1, i + 1); c[i] = false; } } } public static int calc() { int result = Integer.MAX_VALUE; for (int i = 1; i <= n; i++) { int sum = 0; for (int j = 1; j <= m; j++) { sum += copy[i][j]; } result = Math.min(result, sum); } return result; } public static void copyArray() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { copy[i][j] = origin[i][j]; } } } public static int stoi(String s) { return Integer.parseInt(s); } }
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 연구소 2 (0) 2020.02.08 [BOJ] 치킨 배달 (0) 2020.02.08 [BOJ] DSLR (0) 2020.02.07 [BOJ] 숨바꼭질 2 (0) 2020.02.07 [BOJ] 숨바꼭질 4 (0) 2020.02.06