Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*최신 패션 트렌드가 가죽에 두 개의 점이 있는 암소라고 들은 농부 존은 두 개의 점이 있는 암소
- 를 대량으로 구매를 했다. 불행하게도, 패션 트렌드가 빠르게 변해서 가장 인기 있는 현재 패션은
- 점이 하나 있는 암소이다.
- 존은 자신의 암소들을 현재 패션 트렌드에 맞게 바꾸고 싶다. 그래서 두 개의 점에 색을 칠해서
- 한 개의 점으로 만들려고 한다.
- 예를 들어 암소의 가죽이 N(세로) * M(가로) 크기의 격자로 아래와 같이 주어졌을 때:
- ................
- ..XXXX....XXX...
- ...XXXX....XX...
- .XXXX......XXX..
- ........XXXXX...
- .........XXX....
- 여기서 각각의 ‘X’는 점의 일부를 나타낸다. 두 ‘X’가 같은 점으로 취급되는 경우는 상하나 좌우로
- 연결되어 있을 때이다. 대각선으로 연결된 것은 같은 점으로 보지 않는다. 그래서 위 그림은 정확
- 히 두 점이다. 농부 존의 모든 암소는 정확히 두 점을 가지고 있다.
- 존은 두 점을 한 점으로 만들 때 최대한 적게 색칠하고 싶다. 위의 예에서 그는 3군데에 새로운
- ‘X’를 추가하면 된다. (새로운 ‘X’는 ‘*’로 대체해서 쉽게 볼 수 있게 했다. 아래 그림 참조)
- ................
- ..XXXX....XXX...
- ...XXXX*...XX...
- .XXXX..**..XXX..
- ........XXXXX...
- .........XXX....
- */
- package study;
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Scanner;
- class cow{
- int x;
- int y;
- char c;
- public cow(int x, int y, char c) {
- this.x=x;
- this.y=y;
- this.c=c;
- }
- }
- public class adCow {
- static int N,M;
- static char[][] map;
- static int[][] connect;
- static boolean[][] visited;
- static Queue<cow> q=new LinkedList<cow>();
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Scanner sc=new Scanner(System.in);
- N=sc.nextInt();
- M=sc.nextInt();
- map=new char[N][M];
- connect=new int[N][M];
- visited=new boolean[N][M];
- for(int i=0; i<N; i++) {
- map[i]=sc.next().toCharArray();
- }
- char cnt='A';
- for(int i=0; i<N; i++) {
- for(int j=0; j<M; j++) {
- if(map[i][j]=='X') {
- map[i][j]=cnt;
- DFS(i,j,cnt);
- cnt++;
- }
- }
- }
- BFS();
- int min = Integer.MAX_VALUE;
- for(int i=0; i<N; i++) {
- for(int j=0; j<M; j++) {
- for(int k=0; k<4; k++) {
- int x=i+dx[k];
- int y=j+dy[k];
- if(x>=0 && y>=0 && x<N && y<M) {
- if(map[i][j] != map[x][y]) {
- int tmp=connect[i][j]+connect[x][y];
- if(tmp<min) min=tmp;
- }
- }
- }
- }
- }
- System.out.println(min);
- }
- private static void BFS() {
- while(!q.isEmpty()) {
- cow p=q.remove();
- for(int i=0; i<4; i++) {
- int x=p.x+dx[i];
- int y=p.y+dy[i];
- if(x>=0 && y>=0 && x<N && y<M) {
- if(visited[x][y] == false && map[x][y] == '.') {
- visited[x][y]=true;
- map[x][y]=p.c;
- connect[x][y]=connect[p.x][p.y]+1;
- q.add(new cow(x,y,p.c));
- }
- }
- }
- }
- }
- static int[] dx= {-1,0,1,0};
- static int[] dy= {0,-1,0,1};
- private static void DFS(int x, int y, char cnt) {
- for(int i=0; i<4; i++) {
- int xx=dx[i]+x;
- int yy=dy[i]+y;
- if(xx>=0 && yy>=0 && xx<N && yy<M) {
- if(map[xx][yy] == 'X') {
- q.add(new cow(xx,yy,cnt));
- map[xx][yy]=cnt;
- DFS(xx,yy,cnt);
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment