ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준][자바][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

    댓글

Designed by Tistory.