주어진 설명대로만 따라하면 되는 문제이다. 어렵지않다. 다만 문제에서 말한대로만 해야한다.
#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";
}