문제 : boj 14503
풀이
- 벽위치는 space, 청소 여부는 clean 이라는 배열에 저장
- dr, dc에 향하고 있는 방향에 따라 이동하게 되는 위치를 저장
- 북쪽으로 향한 상태(d=0)를 예시로 하면, 왼쪽으로 이동이 가능할 경우 (r+dr[0], c+dc[0])으로 이동하고, 그 경우 향하는 방향은 서쪽이므로 3(=(0+3)%4)이 된다. 이 값을 다시 working()함수에 넣어 다음 이동을 진행한다.
- 왼쪽으로 이동이 불가능한 경우 회전해야 하므로 for문을 통해 원래 향하는 방향과 회전한 방향을 모두 확인한다.
- 모든 방향에서 이동이 불가능하면 후진하여 이동하므로 후진한 좌표를 working()함수에 넣는다.
#include <iostream>
#include <cstdio>
using namespace std;
int N, M, cnt(1), space[51][51];
bool clean[51][51]={{false,}};
int dc[]={-1,0,1,0}, dr[]={0,-1,0,1};
void working(int r,int c, int d){
int tmp_r, tmp_c;
bool is_work=false;
for(int i(0); i < 4; i++){
tmp_r=r+dr[(d+4-i)%4]; tmp_c=c+dc[(d+4-i)%4];
if(0 <= tmp_r && tmp_r < N && 0 <= tmp_c && tmp_c < M){
if(!space[tmp_r][tmp_c] && !clean[tmp_r][tmp_c]){
clean[tmp_r][tmp_c] = true;
cnt ++;
working(tmp_r, tmp_c, (d+3-i)%4);
is_work = true;
break;
}
}
}
if(!is_work){
tmp_r=r+dr[(d+3)%4]; tmp_c=c+dc[(d+3)%4];
if(0 <= tmp_r && tmp_r < N && 0 <= tmp_c && tmp_c < M){
if(!space[tmp_r][tmp_c]) working(tmp_r, tmp_c, d);
}
}
}
int main(){
freopen("input.txt", "r", stdin);
int r,c,d;
cin >> N >> M >> r >> c >> d;
for(int n(0); n < N; n++){
for(int m(0); m < M; m++){
cin >> space[n][m];
}
}
clean[r][c] = true;
working(r,c,d);
cout << cnt;
fclose(stdin);
return 0;
}