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;
		}
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

giraffe_