로봇이 현재 바라보고 있는 방향에서 왼쪽 방향과 조건을 잘 나열하면 된다.
처음에 로봇청소기가 청소한 곳도 다시 돌아가지 못한다라고 생각해서 헤맸다. (벽이랑 동일하다고 생각함)
특정 방향을 제외하고 모든 방향에서 -1 하면 그 방향이라는데.. 생각 안나서 그냥 하드코딩했다
다음에 재귀랑 좀더 간결하게 작성해봐야겠다
import java.util.Scanner;
import java.util.Stack;
public class Main {
static class node {
int i;
int j;
int dir;
public node(int i, int j, int dir) {
this.i = i;
this.j = j;
this.dir = dir;
}
}
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int count = 0;
Stack<node> stack = new Stack();
int r = scan.nextInt();
int c = scan.nextInt();
int d = scan.nextInt();
int[][] arr = new int[n][m];
for(int i = 0; i<n; i++) {
for(int j = 0; j<m; j++) {
arr[i][j] = scan.nextInt();
}
}
int flag = 0;
stack.push(new node(r, c, d));
while(true) {
node no = stack.pop();
if(arr[no.i][no.j] == 0) {
count++; arr[no.i][no.j] = 2;
flag = 0;
}
if(flag == 4) {
flag = 0;
if(no.dir == 0) {
if(no.i < n-1 && arr[no.i+1][no.j] != 1) {
stack.push(new node(no.i+1, no.j, 0));
continue;
}
}
else if(no.dir == 1) {
if(no.j > 0 && arr[no.i][no.j-1] != 1) {
stack.push(new node(no.i, no.j-1, 1));
continue;
}
}
else if(no.dir == 2) {
if(no.i > 0 && arr[no.i-1][no.j] != 1) {
stack.push(new node(no.i-1, no.j, 2));
continue;
}
}
else {
if(no.j < m-1 && arr[no.i][no.j+1] != 1) {
stack.push(new node(no.i, no.j+1, 3));
continue;
}
}
break;
}
//left
if(no.dir == 3) {
if(no.i <n-1) {
if(arr[no.i+1][no.j] == 0) {
stack.push(new node(no.i+1, no.j, 2));
continue;
}
}
stack.push(new node(no.i, no.j, 2));
flag++;
}
//right
else if(no.dir == 1) {
if(no.i>0) {
if(arr[no.i-1][no.j] == 0) {
stack.push(new node(no.i-1, no.j, 0));
continue;
}
}
stack.push(new node(no.i, no.j, 0));
flag++;
}
//up
else if(no.dir == 0) {
if(no.j > 0) {
if(arr[no.i][no.j-1] == 0) {
stack.push(new node(no.i, no.j-1, 3));
continue;
}
}
stack.push(new node(no.i, no.j, 3));
flag++;
}
//bottom
else {
if(no.j < m-1) {
if(arr[no.i][no.j+1] == 0) {
stack.push(new node(no.i, no.j+1, 1));
continue;
}
}
stack.push(new node(no.i, no.j, 1));
flag++;
}
}
System.out.println(count);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[BaekJoon] 백준 14890 경사로 (0) | 2020.05.30 |
---|---|
[BaekJoon] 14888 백준 연산자 끼워넣기 (0) | 2020.05.27 |
[BaekJoon] 백준 14501 퇴사 - Java (0) | 2020.05.21 |
[BaekJoon] 백준 14499 주사위 굴리기 - Java (0) | 2020.05.19 |
[BaekJoon] 백준 2193 이친수 -Java (0) | 2020.05.17 |