백준

백준 소스코드 [C++] 14503 로봇 청소기

Hani_Levenshtein 2021. 2. 1. 20:02

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

백준 소스코드 [C++] 14503 로봇 청소기

#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string>
typedef long long ll;
using namespace std;
int wall[52][52];
bool chk[52][52];
int n, m, sum = 0;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
void dfs(int y,int x,int dir,bool clean) {
	if (clean == true) {
		sum++;
		chk[y][x] = true;
	}
	for (int i = 1;i <= 4;i++) {
		int idx = (dir - i);
		if (idx < 0) idx = idx + 4;
		if (wall[y + dy[idx]][x + dx[idx]] == 0 && chk[y + dy[idx]][x + dx[idx]] == false) {
			dfs(y + dy[idx], x + dx[idx], idx,true);
			return;
		}
	}
	int idx = (dir - 2);
	if (idx < 0) idx = idx + 4;
	if (wall[y + dy[idx]][x + dx[idx]] == 0) {
		dfs(y + dy[idx], x + dx[idx], dir, false);
		return;
	}
	else return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m;
	int y, x, dir;
	cin >> y >> x >> dir;
	for (int i = 0;i <= 51;i++)
		for (int j = 0;j <= 51;j++)
			wall[i][j] = 1;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			cin >> wall[i][j];
	dfs(y+1, x+1, dir,true);
	cout << sum;
	return 0;
}