import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static boolean Debug = false;
private static int MapSize_Y;
private static int MapSize_X;
private static int[][] Map;
private static int[][] Visited;
public static void main(String[] args) throws Exception {
BufferedReader br;
if (Debug && false) {
File f = new File("C:\\Users\\wvimi\\Downloads", "sample_input (11).txt");
FileReader reader = new FileReader(f);
br = new BufferedReader(reader);
} else {
br = new BufferedReader(new InputStreamReader(System.in)); // 직접입력시 이용
}
StringTokenizer st;
// 맵의 크기를 받는다.
st = new StringTokenizer(br.readLine());
MapSize_Y = Integer.parseInt(st.nextToken());
MapSize_X = Integer.parseInt(st.nextToken());
// 로봇의 위치를 받는다.
st = new StringTokenizer(br.readLine());
int startY = Integer.parseInt(st.nextToken());
int startX = Integer.parseInt(st.nextToken());
int rIndex = Integer.parseInt(st.nextToken());
// 맵 입력
Map = new int[MapSize_Y][];
Visited = new int[MapSize_Y][];
for (int i = 0; i < MapSize_Y; i++) {
st = new StringTokenizer(br.readLine());
Map[i] = new int[MapSize_X];
Visited[i] = new int[MapSize_X];
for (int j = 0; j < MapSize_X; j++) {
Map[i][j] = Integer.parseInt(st.nextToken());
}
}
moveRobot(startY, startX, rIndex);
int count = 0;
for (int i = 0; i < MapSize_Y; i++) {
for (int j = 0; j < MapSize_X; j++) {
if (Visited[i][j] == 1) {
count++;
}
}
}
System.out.println(count);
}
private static int[] rotY = { -1, 0, 1, 0 };
private static int[] rotX = { 0, 1, 0, -1 };
private static void moveRobot(int y, int x, int rIndex) {
Visited[y][x] = 1;
log("(%d,%d) 방문", y, x);
if (!isLeftClear(y, x, rIndex)) {
// Command 1
int nIndex = rIndex == 0 ? 3 : rIndex - 1;
int moveY = y + rotY[nIndex];
int moveX = x + rotX[nIndex];
moveRobot(moveY, moveX, nIndex);
} else if (!isAllClear(y, x)) {
// Command 2
int nIndex = rIndex == 0 ? 3 : rIndex - 1;
moveRobot(y, x, nIndex); // 방향 전환
} else if (isMoveBack(y, x, rIndex)) {
// Command 3
int nIndex = rIndex < 2 ? rIndex + 2 : rIndex - 2;
int moveY = y + rotY[nIndex];
int moveX = x + rotX[nIndex];
moveRobot(moveY, moveX, rIndex); // 방향은 유지한 채로 뒤로 한 발자국
} else {
// Command 4
log("I've Done");
}
}
// 로봇의 왼쪽 방향이 깨끗한지
private static boolean isLeftClear(int y, int x, int rIndex) {
int sIndex = rIndex == 0 ? 3 : rIndex - 1;
int moveY = y + rotY[sIndex];
int moveX = x + rotX[sIndex];
if (moveY < 0 || moveY >= MapSize_Y || moveX < 0 || moveX >= MapSize_X) {
return true;
} else if (Map[moveY][moveX] == 1) {
return true;
} else if (Visited[moveY][moveX] == 1) {
return true;
}
return false;
}
// 모든 방향 모두 깨끗한지
private static boolean isAllClear(int y, int x) {
for (int i = 0; i < 4; i++) {
if (!isLeftClear(y, x, i)) {
return false;
}
}
return true;
}
// 후진이 가능한지
private static boolean isMoveBack(int y, int x, int rIndex) {
int sIndex = rIndex < 2 ? rIndex - 2 + 4 : rIndex - 2;
int moveY = y + rotY[sIndex];
int moveX = x + rotX[sIndex];
if (moveY < 0 || moveY >= MapSize_Y || moveX < 0 || moveX >= MapSize_X) {
return false;
} else if (Map[moveY][moveX] == 1) {
return false;
}
return true;
}
public static void log(String input) {
if(Debug) {
System.out.println(input);
}
}
public static void log(String input, Object... args) {
if(Debug) {
System.out.println(String.format(input, args));
}
}
}
'Knowledge > 알고리즘' 카테고리의 다른 글
백준 14501번: 퇴사 (0) | 2017.10.17 |
---|---|
백준 13458번: 시험 감독 (0) | 2017.10.17 |
1953. [모의 SW 역량테스트] 탈주범 검거 (0) | 2017.10.15 |
2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2017.10.15 |
2383. [모의 SW 역량테스트] 점심 식사시간 (0) | 2017.10.15 |