728x90
반응형
https://www.acmicpc.net/workbook/view/1152
https://www.acmicpc.net/problem/14503
문제 해결 방법
1. 동서남북 방향으로 움직을 dx, dy 배열 만들기
2. 청소했을 때 map[x][y]=2 를 해주고, 벽인 경우와 청소한 경우 체크하는 함수 만들기
3. 조건을 나누어 코드짜기
3-1. 4면 회전하고 후진 가능한 경우 : 후진하고 turn=0
3-2. 4면 회전하고 후진 불가능한 경우 : 결과 출력하고 종료
3-3. 청소할 수 있는 경우 : 이동 > 회전 > 청소 > 결과++ > turn=0
3-4. 벽이거나 청소된 경우 : 회전, turn++
#include <iostream>
using namespace std;
int n, m, r, c, d;
int map[51][51];
int dx[] = {-1, 0, 1, 0}; // 위, 오른쪽, 아래, 왼쪽
int dy[] = {0, 1, 0, -1};
bool isWall(int x, int y){
if(map[x][y]==1) return false;
return true;
}
bool isClean(int x, int y){
if(map[x][y]==2) return false; // 이미 청소한 경우
return true;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> r >> c >> d;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> map[i][j];
}
}
int turn = 0;
int result = 1;
map[r][c] = 2;
while(1){
int dd;
if(d==0) dd = 3; // 왼쪽으로 회전
else dd = d - 1;
bool wall = isWall(r+dx[dd], c+dy[dd]); // 벽:false, 빈칸:true
bool clean = isClean(r+dx[dd], c+dy[dd]); // 청소O:false, 청소X:true
if(turn == 4 && isWall(r-dx[d], c-dy[d])){ // 4면 회전 & 후진 가능
r = r-dx[d]; // 후진
c = c-dy[d];
turn = 0;
} else if(turn == 4 && !isWall(r-dx[d], c-dy[d])){ // 4면 회전 & 후진 불가능
cout << result;
return 0;
} else if(wall && clean){ // 청소할 수 있는 경우
r = r+dx[dd]; // 이동
c = c+dy[dd];
d = dd; // 회전
map[r][c] = 2; // 청소
result++;
turn = 0;
} else if(!wall || !clean){ //벽이거나 청소된 경우
d = dd; // 회전
turn++;
}
}
}
728x90
반응형
'알고리즘 > 시뮬레이션 & 구현' 카테고리의 다른 글
[백준/구현/C++] 14500번 테트로미노 (0) | 2023.01.18 |
---|---|
[백준/수학/C++] 17425번 약수의 합 (0) | 2023.01.17 |
[백준/수학/C++] 17427번 약수의 합 2 (0) | 2023.01.17 |
[백준/수학/C++] 1037번 약수 (2) | 2023.01.16 |
[백준/구현/C++] 3190번 뱀 (삼성 SW 역량 테스트 기출) (0) | 2023.01.13 |