본문 바로가기
알고리즘 문제풀이/백준

[백준 14503] 로봇청소기(JAVA/C++)

by 소보루:-) 2020. 3. 1.

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net

 

이전에 C++로 풀었던 문제이다. JAVA로 다시 풀어 보았다.

C++로 풀었을 때는 bool f변수를 사용해서 종료 조건을 확인하였고, JAVA에서는 System.exit(0)을 사용해서 바로 종료하도록 하였다.

 

[JAVA]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static int N,M;
	public static int rx,ry,rd;
	public static int ans=0;
	public static int[][] map;
	//public static int[][] visit;
	public static int[] dx= {-1,0,1,0};
	public static int[] dy= {0,1,0,-1};
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine(), " ");
		rx=Integer.parseInt(st.nextToken());
		ry=Integer.parseInt(st.nextToken());
		rd=Integer.parseInt(st.nextToken());
		map=new int[N][M];
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0; j<M; j++) {
				map[i][j]=Integer.parseInt(st.nextToken());
			}
		}
		map[rx][ry]=2;
		ans++;
		solve(rx,ry,rd);

	}
	private static void solve(int x, int y, int d) {
		int dir=d;
		for(int i=0; i<4; i++) {
			dir = (dir+3)%4;
			int nx = x+dx[dir];
			int ny = y+dy[dir];
			if(map[nx][ny]!=0) continue;
			map[nx][ny]=2;
			ans++;
			solve(nx,ny,dir);
			break;
		}
		if(d==0 || d==2) {
			dir=2-d;
		}else {
			dir=4-d;
		}
		int nx = x+dx[dir];
		int ny = y+dy[dir];
		if(map[nx][ny]==1) {
			System.out.println(ans);
			System.exit(0);
		}
		solve(nx,ny,d);
	}

}

 

[C++]

#include <iostream>

using namespace std;

int N, M;
int map[50][50];
int cnt=0;
bool visited[50][50] = { 0 };
//0북 1동 2남 3서 (d+3)%4
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };

void Start(int x, int y, int d) {
	int nx, ny, nd=d;
	bool f = 0;
	for (int i = 0; i < 4; i++) {
		nd = (nd + 3) % 4;
		nx = x + dx[nd];
		ny = y + dy[nd];
		if (!visited[nx][ny] && map[nx][ny] == 0) {
			visited[nx][ny] = true;
			cnt++;
			f = 1;
			Start(nx, ny, nd);
			break;
		}
		
	}
	if (f == 0) {
		if (d < 2) {
			nd = d + 2;
		}
		else if (d >= 2) {
			nd = d - 2;
		}
		nx = x + dx[nd];
		ny = y + dy[nd];
		if (map[nx][ny] == 0) {
			Start(nx, ny, d);
		}
		else if(map[nx][ny] == 1){
			return;
		}

	}
}
int main() {
	int r, c, d;
	cin >> N >> M;
	cin >> r >> c >> d;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
		}
	}
	visited[r][c] = true;
	cnt++;
	Start(r, c, d);

	cout << cnt;
	return 0;
}

댓글