Guest User

Untitled

a guest
Oct 19th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. /*최신 패션 트렌드가 가죽에 두 개의 점이 있는 암소라고 들은 농부 존은 두 개의 점이 있는 암소
  2. 를 대량으로 구매를 했다. 불행하게도, 패션 트렌드가 빠르게 변해서 가장 인기 있는 현재 패션은
  3. 점이 하나 있는 암소이다.
  4. 존은 자신의 암소들을 현재 패션 트렌드에 맞게 바꾸고 싶다. 그래서 두 개의 점에 색을 칠해서
  5. 한 개의 점으로 만들려고 한다.
  6. 예를 들어 암소의 가죽이 N(세로) * M(가로) 크기의 격자로 아래와 같이 주어졌을 때:
  7. ................
  8. ..XXXX....XXX...
  9. ...XXXX....XX...
  10. .XXXX......XXX..
  11. ........XXXXX...
  12. .........XXX....
  13. 여기서 각각의 ‘X’는 점의 일부를 나타낸다. 두 ‘X’가 같은 점으로 취급되는 경우는 상하나 좌우로
  14. 연결되어 있을 때이다. 대각선으로 연결된 것은 같은 점으로 보지 않는다. 그래서 위 그림은 정확
  15. 히 두 점이다. 농부 존의 모든 암소는 정확히 두 점을 가지고 있다.
  16. 존은 두 점을 한 점으로 만들 때 최대한 적게 색칠하고 싶다. 위의 예에서 그는 3군데에 새로운
  17. ‘X’를 추가하면 된다. (새로운 ‘X’는 ‘*’로 대체해서 쉽게 볼 수 있게 했다. 아래 그림 참조)
  18. ................
  19. ..XXXX....XXX...
  20. ...XXXX*...XX...
  21. .XXXX..**..XXX..
  22. ........XXXXX...
  23. .........XXX....
  24. */
  25.  
  26. package study;
  27.  
  28. import java.util.LinkedList;
  29. import java.util.Queue;
  30. import java.util.Scanner;
  31.  
  32. class cow{
  33. int x;
  34. int y;
  35. char c;
  36. public cow(int x, int y, char c) {
  37. this.x=x;
  38. this.y=y;
  39. this.c=c;
  40. }
  41. }
  42.  
  43. public class adCow {
  44. static int N,M;
  45. static char[][] map;
  46. static int[][] connect;
  47. static boolean[][] visited;
  48. static Queue<cow> q=new LinkedList<cow>();
  49. public static void main(String[] args) {
  50. // TODO Auto-generated method stub
  51. Scanner sc=new Scanner(System.in);
  52. N=sc.nextInt();
  53. M=sc.nextInt();
  54. map=new char[N][M];
  55. connect=new int[N][M];
  56. visited=new boolean[N][M];
  57.  
  58. for(int i=0; i<N; i++) {
  59. map[i]=sc.next().toCharArray();
  60. }
  61. char cnt='A';
  62. for(int i=0; i<N; i++) {
  63. for(int j=0; j<M; j++) {
  64. if(map[i][j]=='X') {
  65. map[i][j]=cnt;
  66. DFS(i,j,cnt);
  67.  
  68. cnt++;
  69. }
  70. }
  71. }
  72.  
  73. BFS();
  74.  
  75. int min = Integer.MAX_VALUE;
  76.  
  77. for(int i=0; i<N; i++) {
  78. for(int j=0; j<M; j++) {
  79. for(int k=0; k<4; k++) {
  80. int x=i+dx[k];
  81. int y=j+dy[k];
  82. if(x>=0 && y>=0 && x<N && y<M) {
  83. if(map[i][j] != map[x][y]) {
  84. int tmp=connect[i][j]+connect[x][y];
  85. if(tmp<min) min=tmp;
  86. }
  87. }
  88. }
  89. }
  90. }
  91. System.out.println(min);
  92. }
  93. private static void BFS() {
  94. while(!q.isEmpty()) {
  95. cow p=q.remove();
  96. for(int i=0; i<4; i++) {
  97. int x=p.x+dx[i];
  98. int y=p.y+dy[i];
  99.  
  100. if(x>=0 && y>=0 && x<N && y<M) {
  101. if(visited[x][y] == false && map[x][y] == '.') {
  102. visited[x][y]=true;
  103. map[x][y]=p.c;
  104. connect[x][y]=connect[p.x][p.y]+1;
  105. q.add(new cow(x,y,p.c));
  106. }
  107. }
  108. }
  109. }
  110. }
  111. static int[] dx= {-1,0,1,0};
  112. static int[] dy= {0,-1,0,1};
  113. private static void DFS(int x, int y, char cnt) {
  114. for(int i=0; i<4; i++) {
  115. int xx=dx[i]+x;
  116. int yy=dy[i]+y;
  117.  
  118. if(xx>=0 && yy>=0 && xx<N && yy<M) {
  119. if(map[xx][yy] == 'X') {
  120. q.add(new cow(xx,yy,cnt));
  121. map[xx][yy]=cnt;
  122. DFS(xx,yy,cnt);
  123. }
  124. }
  125. }
  126. }
  127.  
  128. }
Add Comment
Please, Sign In to add comment