1. 현재 위치를 청소한다.
2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
청소를 마친경우의 좌표값을 2로 만들어서 체크해주었다.
더보기
더보기
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int N, M, x, y, d;
// d -> 0 : 북쪽
// d -> 1 : 동쪽
// d -> 2 : 남쪽
// d -> 3 : 서쪽
static int[][] MAP;
public static void InputData() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(stk.nextToken());
M = Integer.parseInt(stk.nextToken());
stk = new StringTokenizer(br.readLine(), " ");
x = Integer.parseInt(stk.nextToken());
y = Integer.parseInt(stk.nextToken());
d = Integer.parseInt(stk.nextToken());
MAP = new int[N][M];
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());
}
}
br.close();
}
public static boolean isWall(int x, int y){
if(MAP[x][y] == 1) return true;
return false;
}
public static boolean isClean(int x, int y){
if(MAP[x][y] == 2) return true;
return false;
}
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
InputData();
int ans = 0;
int Counter = 0;
while(Counter <= 4){
if(MAP[x][y] == 0) {
MAP[x][y] = 2;
ans++;
}
switch (d){// 현재 바라보는 방향
case 0: //북쪽 -> 서쪽 확인
if(y == 0 || isWall(x, y - 1) || isClean(x, y - 1)){
Counter++;
if(Counter > 4 && (x != N - 1 && !isWall(x + 1, y))){
Counter = 0;
x++;
break;
}// 현재 북쪽을 보고있으므로, 남쪽을 확인
}else {
y--;
Counter = 0;
}
d = 3;
break;
case 1: //동쪽 -> 북쪽 확인
if(x == 0 || isWall(x - 1, y) || isClean(x - 1, y)){
Counter++;
if(Counter > 4 && (y != 0 && !isWall(x, y - 1))){
Counter = 0;
y--;
break;
}// 현재 동쪽을 보고있으므로, 서쪽을 확인
}else {
x--;
Counter = 0;
}
d = 0;
break;
case 2: //남쪽 -> 동쪽 확인
if(y == M - 1 || isWall(x, y + 1) || isClean(x, y + 1)){
Counter++;
if(Counter > 4 && (x != 0 && !isWall(x - 1, y))){
Counter = 0;
x--;
break;
}// 현재 남쪽을 보고있으므로, 북쪽을 확인
}else {
y++;
Counter = 0;
}
d = 1;
break;
default: //서쪽 -> 남쪽 확인
if(x == N - 1 || isWall(x + 1, y) || isClean(x + 1, y)){
Counter++;
if(Counter > 4 && (y != M - 1 && !isWall(x, y + 1))){
Counter = 0;
y++;
break;
}// 현재 서쪽을 보고있으므로, 동쪽을 확인
}else {
x++;
Counter = 0;
}
d = 2;
break;
}
}
bw.write(String.valueOf(ans));
bw.flush(); bw.close();
}
}