본문으로 바로가기

로봇이 현재 바라보고 있는 방향에서 왼쪽 방향과 조건을 잘 나열하면 된다.

 

처음에 로봇청소기가 청소한 곳도 다시 돌아가지 못한다라고 생각해서 헤맸다. (벽이랑 동일하다고 생각함)

 

특정 방향을 제외하고 모든 방향에서 -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);
		
		
	}
	

}