본문 바로가기

연습문제/JAVA

14503-로봇청소기

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

 

청소기 위치와  방향(d), board를 입력받고 clear메소드로 넘어간다

clear에서 큐에 초기값을 넣고 for문을 돌리며 방향을 바꿔준다 (왼쪽으로 한번씩 총 4번)

(if 바라보고 있는 방향이 북쪽이라면 서>남>동>북 순으로 탐색)

 

d의 값은 0-북, 1-동, 2-남, 3-서 로 명시되어있다.

따라서 위치 배열도 북 동 남 서 순으로 지정했다.

 

로봇청소기가 청소를 했다면 search를 true로 바꿔주며 while문 안의 하단 if문에 걸리지 않는다

만약 청소를 못했다면 후진하게 구현, 후진을 못하는 상황이라면 큐에 값을 넣지않아서 while문이 끝나게된다.

 


위치값을 더해줘야 하는데 실수로 빼주게 계산해서 시간이 좀 더 걸렸다. 말고는 쉽게 풀었는것 같다

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class B14503 {
    static int N,M;
    static int res=0;
    static int[][] Board;
    static boolean[][] visited;
    static int[][] D = {{-1,0},{0,1},{1,0},{0,-1}}; //북동남서

    static class Node{
        int r,c,d,m;
        Node(int row, int col, int dir, int move){
            r=row;
            c=col;
            d=dir;
            m=move;
        }
    }
    public static void clear(Node node){
        Queue<Node> queue = new LinkedList<>();
        visited[node.r][node.c] = true;
        queue.add(node);

        while(!queue.isEmpty()){
            Node temp = queue.remove();
            boolean search = false;
            if(temp.m>res) res= temp.m;

            int nd= temp.d;
            for(int i=0; i<4; i++){
                if(nd==0) {
                    nd=3;
                } else {
                    nd = nd-1;
                }
                int nr = temp.r + D[nd][0];
                int nc = temp.c + D[nd][1];

                if(visited[nr][nc]||Board[nr][nc]==1) continue;
                visited[nr][nc] = true;
                queue.add(new Node(nr,nc,nd,temp.m+1));
                search = true;
                break;
            }
            if(!search){
                int back=0;
                if(temp.d==0) back=2;
                if(temp.d==1) back=3;
                if(temp.d==3) back=1;

                int br = temp.r + D[back][0];
                int bc = temp.c + D[back][1];
                if(Board[br][bc]==1) {
                    break;
                }
                queue.add(new Node(br, bc, temp.d, temp.m));
            }
        }
        System.out.println(res);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();   //세로
        M = sc.nextInt();   //가로

        int sRow = sc.nextInt();
        int sCol = sc.nextInt();
        int sDir = sc.nextInt();

        Board = new int[N][M];
        visited = new boolean[N][M];

        for(int i=0; i<N; i++){
            for(int j=0; j<M; j++){
                Board[i][j] = sc.nextInt();
            }
        }
        clear(new Node(sRow,sCol,sDir,1));
    }
}

'연습문제 > JAVA' 카테고리의 다른 글

2573-빙산  (0) 2022.08.10
5014-스타트링크  (0) 2022.08.10
7569-토마토  (0) 2022.08.09
11724-연결 요소의 개수  (0) 2022.08.09
11724-연결 요소의 개수 (오답)  (0) 2022.08.09