[백준] 17406. 배열돌리기4 (JAVA)

728x90
반응형

www.acmicpc.net/problem/17406

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의

www.acmicpc.net

거의 인내심 테스트 문제.. 

SW역량 어렵게 나오면 이렇게..? 시간 많이 잡아먹게 나올듯 

 

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 map[][];
	static int n_map[][];
	static int r,c,s;
	static int ypos[]= {0,1,0,-1};
	static int xpos[]= {1,0,-1,0};
	static int sum=Integer.MAX_VALUE;
	static int[][] command;
	static boolean[] visited;
	static int[] num;
	static int[] target;
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		st=new StringTokenizer(br.readLine());
		n=Integer.parseInt(st.nextToken());
		m=Integer.parseInt(st.nextToken());
		k=Integer.parseInt(st.nextToken());
		map=new int[n][m];
		command=new int[k][3];
		target=new int[k];
		for (int i = 0; i < k; i++) {
			target[i]=i;
		}
		num=new int[k];
		visited=new boolean[k];
		for (int i = 0; i < n; i++) {
			st=new StringTokenizer(br.readLine());
			for (int j = 0; j < m; j++) {
				map[i][j]=Integer.parseInt(st.nextToken());
			}
			
		}
		
		for (int i = 0; i < k; i++) {
			st=new StringTokenizer(br.readLine());
			command[i][0]=Integer.parseInt(st.nextToken());
			command[i][1]=Integer.parseInt(st.nextToken());
			command[i][2]=Integer.parseInt(st.nextToken());
		}
		nPr(0);
		
		System.out.println(sum);
		
	}
private static void nPr(int cnt) {
		
		if(cnt==k) {
			n_map=deepCopy();
			for(int x:num) {
				r=command[x][0];
				c=command[x][1];
				s=command[x][2];
				rotate(r-s-1,c-s-1,2*s);
			}
			for (int w = 0; w < n; w++) {
				int temp=0;
				for (int j = 0; j < m; j++) {
					temp+=n_map[w][j];
				}
				if(temp<sum)sum=temp;
			}
			return;
		}
		for (int i = 0; i < k; i++) {
			if(visited[i])continue;
			visited[i]=true;
			num[cnt]=target[i];
			nPr(cnt+1);
			visited[i]=false;
		}
		
	} 
	private static int[][] deepCopy(){
		int[][] res=new int[n][m];
		for (int i = 0; i < n; i++) {
			System.arraycopy(map[i], 0, res[i], 0, m);
		}
		return res;
	}
	
	private static void rotate(int i, int j, int len) {
		int x=j;
		int y=i;
		while(len>=2) {
			int cnt=0;
			int dir=0;
			int temp=n_map[y][x];
			while(cnt!=4*len) {
				int yy=y+ypos[dir];
				int xx=x+xpos[dir];
				if(xx<j || yy<i || xx>j+len || yy>i+len) {
					dir=(dir+1)%4;
					continue;
				}
				int temp2=n_map[yy][xx];
				n_map[yy][xx]=temp;
				temp=temp2;
				y=yy;
				x=xx;
				cnt+=1;
			}
			len-=2;
			x=++j;
			y=++i;
		}
		
	}
}

 

728x90
반응형
TAGS.

Comments