-
[백준][자바][2146 다리] 해결못함코딩/알고리즘 2018. 10. 7. 21:08
ㅠㅠ..
또 해결못했다 접근 방법은 맞는거 같은데 뭐가 문젠지 찾지못했다...
잠시 쉬었다해야곘다...너무 힘ㅁ들다....
package aa; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; class b_Point{ int x; int y; b_Point(int y, int x){ this.x = x; this.y = y; } } public class backjoon_2146_다리 { static int[][] map = new int [101][101]; static int[][] island = new int [101][101]; static int[][] temp = new int [101][101]; static boolean[][] visited = new boolean[101][101]; static int n; static int[] dx = {0,0,-1,1}; static int[] dy = {-1,1,0,0}; static int low = 100; static int bridgeCnt = 0; static Queue
bq = new LinkedList (); public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); StringTokenizer st; for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine(), " "); int idx = 0; while(st.hasMoreTokens()) { map[i][idx] = Integer.parseInt(st.nextToken()); idx++; } } /*섬마다 번호 매기기 */ int islandName = 1; for(int i =0 ; i < n; i++) { for (int j = 0; j < n; j++ ) { if(!visited[i][j] && map[i][j] == 1) { find_Island(i,j,islandName); islandName++; } } } //한번썻으니 초기화 visited = new boolean[101][101]; printMap(); //island 마다 bfs 돌리자 for (int islandNum = 1; islandNum < islandName; islandNum++) { //맨 처음 엣지 찾고 큐에 넣기 for(int i =0 ; i < n; i++) { for (int j = 0; j < n; j++ ) { if(island[i][j] == islandNum) { if(isEdge(i,j)) { //System.out.println(i+ " "+ j); bq.add(new b_Point(i, j)); } } } } //섬마다 다리 건설 while(true) { if ( buliding_Bridge(islandNum)) { break; } //printMap(); } //초기화 restore(); } System.out.println(low - 1 ); //printMap(); } /* 초기화 하기 */ public static void restore() { //island 초기화 for(int i =0 ; i < n; i++) { for (int j = 0; j < n; j++ ) { island[i][j] = temp[i][j]; } } //비짓 배열 초기화 visited = new boolean[101][101]; bq = new LinkedList (); bridgeCnt = 0; } /* 제일 끝단 찾기 */ public static boolean isEdge(int sero, int garo) { for(int i = 0; i < 4; i++) { int xx = dx[i] + garo; int yy = dy[i] + sero; if(xx >= 0 && xx < n && yy >= 0 && yy < n) { if(island[yy][xx] == 0 ) { return true; } } } return false; } /*최저점 찾기 */ public static void find_lowest(int value) { if(low > value) { low = value; } } /* 섬마다 bfs로 돌리기 */ public static boolean buliding_Bridge(int islandNum) { bridgeCnt += 1; //System.out.println("buliding"); int bqSize = bq.size(); for(int size = 0; size < bqSize; size++ ) { b_Point b = bq.poll(); int garo = b.x; int sero = b.y; for(int i = 0; i < 4; i++) { int xx = dx[i] + garo; int yy = dy[i] + sero; if(xx >= 0 && xx < n && yy >= 0 && yy < n) { //방문 안했고 내 섬번호가 아니고, if(!visited[yy][xx] && island[yy][xx] != islandNum) { //0이 아니라면( 섬인경우 ) if(island[yy][xx] != 0 ) { //System.out.println(yy+ " " + xx); find_lowest(bridgeCnt); return true; } else { island[yy][xx] = islandNum; visited[yy][xx] = true; bq.add(new b_Point(yy,xx)); } } } } } return false; } /*dfs로 각 섬의 번호 매기기 */ public static void find_Island(int sero, int garo, int name) { visited[sero][garo] = true; island[sero][garo] = name; temp[sero][garo] = name; for(int i = 0; i < 4; i++) { int xx = dx[i] + garo; int yy = dy[i] + sero; if(xx >=0 && xx < n && yy >= 0 && yy < n) { if(!visited[yy][xx] && map[yy][xx] == 1) { visited[yy][xx] = true; island[yy][xx] = name; temp[yy][xx] = name; find_Island(yy,xx,name); } } } } public static void printMap() { System.out.println("----"); for (int i = 0 ; i < n; i++) { for(int j = 0; j< n; j++) { System.out.print(island[i][j] + " "); } System.out.println(); } //System.out.println(mwh.Sangun_Point.x); //System.out.println(mwh.Sangun_Point.y); System.out.println("----"); } } '코딩 > 알고리즘' 카테고리의 다른 글
[백준][자바][11559 Puyo Puyo] (0) 2018.10.13 [백준][자바][1021]회전하는 큐 (0) 2018.10.11 [백준][자바][5427 불] (0) 2018.10.07 [백준][자바][1063]킹 (0) 2018.10.02 [백준][자바][14502]연구소 (0) 2018.10.01