https://www.acmicpc.net/problem/14503
#include <iostream>
using namespace std;
int wall[55][55]; // 벽
int clean[55][55]; // 청소 유무
int dy[4] = {-1, 0, 1, 0}; // 북 동 남 서
int dx[4] = {0, 1, 0, -1};
int ry, rx; int way; int cnt = 1;
int n, s;
void input();
void solve(int y, int x);
int main(){
input();
solve(ry, rx);
printf("%d", cnt);
}
void input(){
scanf("%d %d", &n, &s);
scanf("%d %d", &ry, &rx); scanf("%d", &way);
for(int j = 0; j < n; j++){
for(int i = 0; i < s; i++) {
scanf("%d", &wall[j][i]);
}
}
}
void solve(int y, int x){
clean[y][x] = 1;
int blocked = 0;
for(int i = 0; i < 4; i++) {
if (clean[y + dy[i]][x + dx[i]] or wall[y + dy[i]][x + dx[i]] or (y + dy[i] >= n or y + dy[i] < 0 or x + dx[i] >= s or x + dx[i] < 0)){ // 청소 되었거나 벽이거나 범위를 벗어난다면
blocked++;
}
}
if (blocked == 4) { // 모든 방향이 청소 되었거나 벽이거나 범위를 벗어났다.
if (y - dy[way] >= n or y - dy[way] < 0 or x - dx[way] >= s or x - dx[way] < 0){ // 범위를 벗어났다
return;
}
if (wall[y - dy[way]][x - dx[way]]) { // 벽이다
return;
}
else{ //후진한다
solve(y - dy[way], x - dx[way]);
}
}
else { // 청소해야할 범위가 있다.
way -= 1; way = (way < 0 ? 3 : way); // 왼쪽으로 회전한다.
if (!clean[y + dy[way]][x + dx[way]] and !wall[y + dy[way]][x + dx[way]] and !(y + dy[way] >= n or y + dy[way] < 0 or x + dx[way] >= s or x + dx[way] < 0)) { // 청소가 되지 않았으며 벽이 아니며 범위를 벗어나지 않았을때
solve(y + dy[way], x + dx[way]); cnt++;
}
else { // 같은 자리에서 회전한다.
solve(y, x);
}
}
}
|
cs |
풀이
시뮬레이션 입니다
'백준(C, C++) > 골드' 카테고리의 다른 글
백준 17144: 미세먼지 안녕! [C/C++], 삼성 코딩 테스트 (0) | 2022.06.13 |
---|---|
백준 20056: 마법사 상어와 파이어볼 [C/C++], 삼성 코딩 테스트 (0) | 2022.06.12 |
백준 3078: 좋은 친구 [C/C++] (0) | 2022.06.11 |
백준 15961: 회전 초밥 [C/C++] (0) | 2022.06.07 |
백준 7450: Bin Packing [C/C++] (0) | 2022.06.07 |