728x90
https://www.acmicpc.net/problem/14503
문제 요약
- 방의 크기는 N x M
- 방의 각 칸은 좌표 (r ,c)로 나타낸다.
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
- 바라보는 방향을 유지한 채로 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라면 작동을 멈춘다.
- 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
- 반시계 방향으로 90도 회전한다.
- 바라보는 방향의 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다.
입력과 출력
제출 답안
#include<iostream>
#include<vector>
using namespace std;
int N;
int M;
int r;
int c;
int d;
vector<vector<int>> v;
vector<int> vi;
int result = 0;//청소하는 칸의 수
void ClearHere();
void CheckFourDir();
bool IsWall(int x, int y);
bool CantClear(int x, int y);
bool isFinish = false;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;//방의 크기
cin >> r >> c >> d;//로봇청소기의 좌표, 방향(0:북,1:동,2:남,3:서)
v.resize(N, vector<int>(M));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> v[i][j];
}
}
//처음에 청소
ClearHere();
return 0;
}
void ClearHere() {
//주변 4방향 검사
while (!isFinish) {
if (v[r][c] == 0) {
result++;
v[r][c] = 2;//청소 완료
}
CheckFourDir();
}
return;
}
void CheckFourDir() {
if (v[r - 1][c] == 0 || v[r][c - 1] == 0 || v[r + 1][c] == 0 || v[r][c + 1] == 0) {
//빈 칸이 있는 경우
d--;//반시계 방향으로 90도 회전
if (d == -1) d = 3;
bool cantMove = true;
//앞으로 전진
if (d == 0) cantMove = CantClear(r-1, c);
else if (d == 1) cantMove = CantClear(r, c+1);
else if (d == 2) cantMove = CantClear(r+1, c);
else if (d == 3) cantMove = CantClear(r, c-1);
if (cantMove) {//앞이 벽인 경우
isFinish = false;
return;
}
else {
if (d == 0) r--;
else if (d == 1)c++;
else if (d == 2) r++;
else if (d == 3) c--;
isFinish = false; return;
}
}
else {
//빈 칸이 없는 경우 후진
bool cantMove = true;
//후진 가능한지 확인
if (d == 0) cantMove = IsWall(r+1, c );
else if (d == 1) cantMove = IsWall(r, c-1);
else if (d == 2) cantMove = IsWall(r-1, c);
else if (d == 3) cantMove = IsWall(r, c+1);
if (cantMove)
{//후진할 수 없는 경우
cout << result;//결과 출력
isFinish = true; return;
}
else {
//1번으로 돌아간다.
if (d == 0) r++;
else if (d == 1) c--;
else if (d == 2) r--;
else if (d == 3) c++;
isFinish = false; return;
}
}
}
bool CantClear(int x, int y) {
return (v[x][y] == 1 || v[x][y] == 2);
}
bool IsWall(int x, int y) {
return v[x][y] == 1;
}
728x90
'공부 > BAEKJOON' 카테고리의 다른 글
[C++] 백준 2578번 : 빙고 (0) | 2025.05.26 |
---|---|
[C++] 백준 11660번: 구간 합 구하기5 (0) | 2025.01.14 |
[C++] 백준 11659번: 구간 합 구하기4 (0) | 2025.01.12 |
[C++] 백준 1546: 평균 (1) | 2025.01.11 |
[C++] 백준 11720: 숫자의 합 (0) | 2025.01.11 |