[BaekJoon]2012オーガニック白菜


1.  質問リンク


https://www.acmicpc.net/problem/1012

2.  質問する




サマリ


有機ハクサイ
  • を栽培し,ハクサイを害虫から保護することが重要であるため,ハクサイ白ミミズを購入した.
  • ある白菜に1匹の白ミミズが生息していれば隣接する白菜に移動することができ、その白菜が上下左右4方向に他の白菜があれば害虫にも保護される.
  • 白菜があちこちに植えられていて、この配置に必要な白菜白ミミズの最少数の問題です.
  • 入力
  • 行目は、テストケースの数を示し、次いで、各テストケースの次の行である.
  • の試験例において、1行目は白菜畑の横方向長さM、縦方向長さN、白菜栽培位置の個数Kであり、2行目からK行目は白菜の位置X、Yであった.
  • 出力:各試験盤キャビネットに対して、最小の白菜白ミミズ数を出力する.
  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    public class Main {
    	static int count = 0;
    	int[][] map;
    	int[][] check;
    	static int row;
    	static int col;
    	
    	public void dfs(int x, int y) {
    		check[x][y] = 1;
    		int[] four_directions_x = {0, 0, -1, 1};
    		int[] four_directions_y = {-1, 1, 0, 0};
    		for(int i = 0; i < 4; i++) {
    			int check_x = x + four_directions_x[i];
    			int check_y = y + four_directions_y[i];
    			if(check_x >= 0 && check_y >= 0 && check_x < row && check_y < col) {
    				if(map[check_x][check_y] == 1 && check[check_x][check_y] == 0) {
    					dfs(check_x, check_y);
    				}
    			}
    		}
    	}
    	
    	public void makeMap(ArrayList<String> point) {
    		map = new int[row][col];
    		check = new int[row][col];
    		for(int i = 0; i < point.size(); i++) {
    			StringTokenizer st = new StringTokenizer(point.get(i));
    			int y = Integer.parseInt(st.nextToken());
    			int x = Integer.parseInt(st.nextToken());
    			map[x][y] = 1;
    		}
    	}
    	
    	public void getMinNum(ArrayList<String> point) {
    		makeMap(point);
    		for(int i = 0; i < row; i++) {
    			for(int j = 0; j < col; j++) {
    				if(map[i][j] == 1 && check[i][j] == 0) {
    					count++;
    					dfs(i, j);
    				}
    			}
    		}
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		int case_num = Integer.parseInt(br.readLine());
    		int[] result = new int[case_num];
    		for(int i = 0; i < case_num; i++) {
    			String case_str = br.readLine();
    			StringTokenizer st = new StringTokenizer(case_str);
    			col = Integer.parseInt(st.nextToken());
    			row = Integer.parseInt(st.nextToken());
    			int num = Integer.parseInt(st.nextToken());
    			ArrayList<String> point = new ArrayList<String>();
    			for(int j = 0; j < num; j++) {
    				point.add(br.readLine());
    			}
    			Main m = new Main();
    			m.getMinNum(point);
    			result[i] = count;
    			count = 0;
    		}
    		br.close();
    		for(int i = 0; i < result.length; i++) {
    			bw.write(result[i] + "\n");
    		}
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく

  • (0,0)からこの位置の上下左右4方向に白菜が存在するかどうかを調べ,存在する場所を見つけ,この地域に白菜の白ミミズを1匹置いた.
  • をすべて白菜畑全域に行い,白菜白ミミズの数を求めればよい.
  • ハクサイの栽培位置に基づいて、同じ大きさの2次元配列を作成し、2次元配列がハクサイ園を形成することを決定し、各領域を検査した.
  • (0,0)から白菜畑の横方向検査を開始し、この場所に白菜が植えられ、白菜の位置が確定していない場合、白菜ミミズの数1を増やし、2次元配列の位置の値を変更して白菜が検査されたかどうかを決定し、DFSを使用して隣接する白菜を検査する.
  • DFSを使用しているため、この位置で上下左右をチェックし、隣接する白菜の位置が見つかった場合は、2次元配列の位置の値を変更して存在するかどうかをチェックし、その位置で再びDFSを使用して上下左右をチェックし、隣接する白菜が存在するかどうかをチェックします.
  • 隣接する白菜がない場合は、前の位置に戻って、異なる方向を確定し、隣接する白菜がある場合は、3回繰り返します.
  • すべての方向に隣接する白菜がない場合、または特定された白菜がすべてない場合、横方向の次の位置に移動する.
  • は2日から5日まで、すべての白菜畑が確認されるまで.