プログラマレベル2)距離チェック


リンク:グリズリー式ピストル2)


質問する

  • 待機室(places):5 x 5サイズ
  • P:受験者位置
  • O:空きテーブル
  • X:パーティション
  • 受験者は距離(r 1,c 1)、(r 2,c 2)
    |r1-r2|+|c1-c2|>2.
  • 受験者間にパーティションが存在する場合、
  • を許可する.
    出力:距離が完全に保持されている場合は、1または0を返します.

    に答える


    この問題はcotteでやった問題です~
    簡単に解けそう
    問題を見ればDFSタイプだとわかります.

    文は順番に待合室を回っているからです.
    このとき受験者のいるラウンジを見つけたらDFSを回します.
    受験者座標を上下左右に移動します.
    上下左右座標
    Xなら行く必要がないので帰ってきました.
    Pの場合は、距離が2より小さいことを確認し、2より小さい場合は距離を保持できないため、前のメソッドに戻り、0を返します.
    ※ここで注意したいのは、|r 1-r 2|+|c 1-c 2|=0の場合、自分の身分で0を返すことはできません.

    インプリメンテーション

    class Solution {
        static int ok;
    	public static void dfs(int N, int j, int k, int x, int y, String[] places, boolean[][] check) {
    		if (x < 0 || x >= N || y < 0 || y >= N)
    			return;
    		if (places[x].charAt(y) == 'X')
    			return;
    		if (check[x][y] == true)
    			return;
    		if (Math.abs(j - x) + Math.abs(k - y) > 2)
    			return;
    		if (Math.abs(j - x) + Math.abs(k - y) != 0 && places[x].charAt(y) == 'P') {
    			ok = 0;
    			return;
    		}
    		check[x][y] = true;
    		dfs(N, j, k, x + 1, y, places, check);
    		dfs(N, j, k, x - 1, y, places, check);
    		dfs(N, j, k, x, y + 1, places, check);
    		dfs(N, j, k, x, y - 1, places, check);
    	}
    
    	public static int checkPlace(String[] places, int N) {
    		for (int i = 0; i < N; i++) {
    			for (int j = 0; j < N; j++) {
    				boolean[][] check = new boolean[N][N];
    				if (places[i].charAt(j) == 'P') {
    					ok = 1;
    					dfs(N, i, j, i, j, places, check);
    					if (ok == 0)
    						return 0;
    				}
    			}
    		}
    		return 1;
    	}
    
        public int[] solution(String[][] places) {
            int[] answer = new int[places.length];
    		int N = 5;
    		for (int i = 0; i < places.length; i++)
    			answer[i] = checkPlace(places[i], N);
    		return answer;
        }
    }