ロボット掃除機(14503)
2668 ワード
1.質問
質問リンク
2.解答
2-1. 条件
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();
}
}
Reference
この問題について(ロボット掃除機(14503)), 我々は、より多くの情報をここで見つけました https://velog.io/@front/백준-로봇-청소기-14503テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol