[白俊]安全区域2468号-Java


[白俊]安全区域2468号
私の答え
public class SafeZone {
    static int[][] graph = new int[100][100];
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static boolean[][] visited;
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        StringTokenizer st;

        int maxHeight = 0;
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < N; j++) {
                graph[i][j] = Integer.parseInt(st.nextToken());
                maxHeight = (int) Math.max(maxHeight, graph[i][j]);
            }
        }

        int answer = 0;
        for(int i = 0; i < maxHeight + 1; i++) {
            int count = 0;
            visited = new boolean[100][100];
            for(int x = 0; x < N; x++) {
                for(int y = 0; y < N; y++) {
                    if(dfs(x, y, i)) {
                        count++;
                    }
                }
                answer = (int)Math.max(count, answer);
            }
        }

        System.out.println(answer);
    }

    private static boolean dfs(int x, int y, int i) {
        if(visited[x][y] || graph[x][y] <= i) {
            return false;
        }

        visited[x][y] = true;

        for(int j = 0; j < 4; j++) {
            int nx = x + dx[j];
            int ny = y + dy[j];

            if(nx < 0 || ny < 0 || nx >= N || ny >= N) {
                continue;
            }

            if(graph[nx][ny] <= i) {
                continue;
            }

            if(graph[nx][ny] > i && !visited[nx][ny]) {
                dfs(nx, ny, i);
            }
        }

        return true;
    }
}
  • dfsを使用してアクセスしました.問題の要旨は,入力高さより大きい値がいくつかの区間に分かれていることを見出すことである.従って,同じ値ではなくdfsによってより大きな値を探索しなければならない.
  • dfsで使用するために,二次配列やアクセス配列などをクラス変数として生成する.
  • をループし、入力された配列の値をグラフィック配列に入れ、入力された高さから最も高い値を求める.
  • 0から最大高さまでdfsで確認する必要があります.したがって,最大高さ0から最大高さまでの繰り返し文しか書けない.また,配列が完了するたびにアクセスレコードとcountが初期化されるため,初期化が必要となる.二次配列を迂回して、座標と高さをパラメータとしてdfsに渡します.
  • 入力された座標にアクセスした場合、またはその座標の値が最大高さより小さい場合、falseが返されます.
  • でなければ、座標の処理にアクセスします.
  • それからあなたの方向をチェックします.上、下、左、右が配列範囲を超えている場合、次の対応する方向はcontinueでスキップされます.
  • であり、上、下、左、右の座標を有する図の値がi以下である場合、条件に合致するため、スキップも継続する.
  • 最後に、上、下、左、右において、この座標を有する図の値はiより大きく、アクセスレコードがなければ再帰呼び出しにより探索を継続する.検索が完了するとtrueが返され、if文を通過するとcountは1増加します.
  • このプロセスを繰り返すと、この高さよりも多くの区間があることがわかります.
  • は最後にcountの最値を要求するので、Math.maxを使用して最値比較を行うべきです.