ロボット掃除機(14503)


1.質問


質問リンク


2.解答


2-1. 条件

  • ロボットは反時計回りに回転します.
  • の4方向はすべて清掃または壁で、後ろの方向が壁で、バックできない場合は、作業を停止します.
  • (ベースケース)

    2-2. に答える


    問題の説明に従って実施すればよい.
    問題で要求されるロボットの動作は、動作が停止するまで同じ動作を繰り返します.
    この場合、再帰関数はよく使用されます.
    再帰停止運転の条件が満たされるまで(2号条件)
    問題で必要な操作を続行すればよい.
    再帰関数は、ロボット座標と現在表示されている方向をパラメータとして受信することで実現できます.
    整理してから.
    1.まずロボットの位置を整理します.
    2.4方向に移動し、クリーンアップが必要な箇所があればその部分をクリーンアップし、ロボットを再帰関数で移動します.
    3.4方向に清掃があり、壁であればバックします.
    3-1. 立ち後れた場所も壁であれば、ロボットは作業を停止します.
    3-2. バックする場所が壁でない場合は、再帰関数を使用してバックロボットを使用します.

    3.完全なコード

    package Main;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.StringTokenizer;
    
    public class Main {
    
    	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    	static int[][] map;
    	static int[] my = {-1, 0, 1, 0}, mx = {0, 1, 0, -1},  ry = {1, 0, -1, 0}, rx = {0, -1, 0, 1};
    	
    	static int f(int y, int x, int d) {
    		// 2. 4방향을 탐색해서 청소할 곳이 있다면 그 부분을 청소하고 재귀 함수로 로봇을 이동시킵니다.
    		for (int dir = 0; dir < 4; dir++) {
    			d = (d + 3) % 4;
    			int ny = y + my[d];
    			int nx = x + mx[d];
    			
    			// 청소할 칸이라면
    			if (map[ny][nx] == 0) {
    				map[ny][nx] = 2; // 청소
    				return 1 + f(ny, nx, d);
    			}
    		}
    		
    		// 3. 4방향 모두 청소가 돼있거나 벽이라면 후진합니다.
    		int backY = y + ry[d];
    	        int backX = x + rx[d];
    		
    	        // 3-1. 후진한 곳도 벽이라면 로봇의 작동을 멈춥니다.
    	        // 3-2. 후진한 곳이 벽이 아니라면 재귀 함수로 로봇을 후진시킵니다.
    		return map[backY][backX] == 1 ? 0 : f(backY, backX, d);
    	}
    	
    	public static void main(String[] args) throws Exception {
    		StringTokenizer stk = new StringTokenizer(br.readLine());
    		int N = Integer.parseInt(stk.nextToken());
    		int M = Integer.parseInt(stk.nextToken());
    		map = new int[N][M];
    		
    		stk = new StringTokenizer(br.readLine());
    		
    		int y = Integer.parseInt(stk.nextToken());
    		int x = Integer.parseInt(stk.nextToken());
    		int d = Integer.parseInt(stk.nextToken());
    		
    		for (int i = 0; i < N; i++) {
    			stk = new StringTokenizer(br.readLine());
    			
    			for (int j = 0; j < M; j++)
    				map[i][j] = Integer.parseInt(stk.nextToken());
    		}
    		
    		map[y][x] = 2;
    		// 1. 맨 처음에 로봇이 위치한 곳을 청소합니다. (처음에 + 1)
    		bw.write(1 + f(y, x, d) + "");
    		bw.close();
    	}
    }