C++:: boj 14503 < 로봇 청소기 >

jahlee·2023년 9월 16일
0
post-thumbnail

주어진 설명대로만 따라하면 되는 문제이다. 어렵지않다. 다만 문제에서 말한대로만 해야한다.

#include <iostream>
#include <vector>
using namespace std;

int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n, m, cur_x, cur_y, cur_dir, answer;

bool isNotCleaned(vector<vector<int> >& board) {// 주변에 청소 안된 곳이 있는지
	for (int dir=0; dir<4; dir++) {
		if (!board[cur_x + dx[dir]][cur_y + dy[dir]]) {
			return true;
		}
	}
	return false;
}

void dfs(vector<vector<int> >& board) {
	if (!board[cur_x][cur_y]) {// 청소 안되었다면
		board[cur_x][cur_y] = 2;
		answer++;
	}
	int nx, ny;
	if (isNotCleaned(board)) {// 청소할 곳이 있다면
		cur_dir = (cur_dir + 3) % 4;//반시계
		nx = cur_x + dx[cur_dir];
		ny = cur_y + dy[cur_dir];
		if (!board[nx][ny]) {//청소해야하는 곳이면 이동
			cur_x = nx;
			cur_y = ny;
		}
		dfs(board);
	} else {// 청소할 곳이 없으면
		nx = cur_x - dx[cur_dir];
		ny = cur_y - dy[cur_dir];
		if (board[nx][ny] == 1) {// 후진불가능하면
			return;
		}
		cur_x = nx;
		cur_y = ny;
		dfs(board);
	}
}

int main() {
	cin >> n >> m;
	vector<vector<int> > board(n, vector<int>(m));
	cin >> cur_x >> cur_y >> cur_dir;
	for (int i=0; i<n; i++) {
		for (int j=0; j<m; j++) {
			cin >> board[i][j];
		}
	}
	dfs(board);
	cout << answer << "\n";
}

0개의 댓글