문제 : 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;
}