[백준 14503번 C/C++] 로봇 청소기
[백준 14503번 C/C++] 로봇 청소기
https://www.acmicpc.net/problem/14503
해결전략
구현
정답코드
#include <iostream>
#include <vector>
using namespace std;
int dirY[4] = { -1, 0, 1, 0 };
int dirX[4] = { 0, 1, 0, -1 };
int n, m;
int currY, currX, currDir;
vector<vector<int>> v;
int answer; // 청소하는 칸의 개수
bool Move(int y, int x, int dir)
{
// 4 방향 체크
for (int i = 0; i < 4; i++) {
int nextDir = (dir + 3 - i) % 4; // 왼쪽으로 돌기
int ny = y + dirY[nextDir];
int nx = x + dirX[nextDir];
if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue;
if (v[ny][nx] == 0){
v[ny][nx] = -1;
answer++;
currY = ny, currX = nx, currDir = nextDir;
return true;
}
}
// 후진
if (dir == 0 && y + 1 < n && v[y + 1][x] != 1){
currY = y + 1, currX = x, currDir = dir;
return true;
}
else if (dir == 1 && 0 <= x - 1 && v[y][x - 1] != 1){
currY = y, currX = x - 1, currDir = dir;
return true;
}
else if (dir == 2 && 0 <= y - 1 && v[y - 1][x] != 1){
currY = y - 1, currX = x, currDir = dir;
return true;
}
else if (dir == 3 && x + 1 < m && v[y][x + 1] != 1){
currY = y, currX = x + 1, currDir = dir;
return true;
}
return false;
}
void Clean(int y, int x, int dir)
{
//cout << y << ", " << x << ", dir = " << dir << "\n";
if (Move(y, x, dir)){
Clean(currY, currX, currDir);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
v.resize(n, vector<int>(m));
cin >> currY >> currX >> currDir;
for (int y = 0; y < n; y++){
for (int x = 0; x < m; x++) {
cin >> v[y][x];
}
}
// 시작 칸이 아직 청소되지 않은 경우, 시작 칸을 청소
if (v[currY][currX] == 0) {
v[currY][currX] = -1;
answer++;
}
Clean(currY, currX, currDir);
cout << answer;
return 0;
}
해결전략
처음 실수한 부분
for (int i = dir; i < dir + 4; i++){
int ny = y + dirY[i % 4];
int nx = x + dirX[i % 4];
if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue;
if (v[ny][nx] == 0){
v[ny][nx] = -1;
answer++;
currY = ny, currX = nx, currDir = (i % 4);
return true;
}
}
고친 코드
for (int i = 0; i < 4; i++) {
int nextDir = (dir + 3 - i) % 4; // 왼쪽으로 돌기
int ny = y + dirY[nextDir];
int nx = x + dirX[nextDir];
if (ny < 0 || n <= ny || nx < 0 || m <= nx) continue;
if (v[ny][nx] == 0){
v[ny][nx] = -1;
answer++;
currY = ny, currX = nx, currDir = nextDir;
return true;
}
}
Ver.1
if (dir == 0 && y + 1 < n && v[y + 1][x] != 1){
currY = y + 1, currX = x, currDir = dir;
return true;
}
else if (dir == 1 && 0 <= x - 1 && v[y][x - 1] != 1){
currY = y, currX = x - 1, currDir = dir;
return true;
}
else if (dir == 2 && 0 <= y - 1 && v[y - 1][x] != 1){
currY = y - 1, currX = x, currDir = dir;
return true;
}
else if (dir == 3 && x + 1 < m && v[y][x + 1] != 1){
currY = y, currX = x + 1, currDir = dir;
return true;
}
Ver.2
int backDir = (dir + 2) % 4;
int ny = y + dirY[backDir];
int nx = x + dirX[backDir];
if (ny >= 0 && ny < n && nx >= 0 && nx < m && v[ny][nx] != 1) {
currY = ny;
currX = nx;
currDir = dir;
return true;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를 (0) | 2024.07.30 |
---|---|
[백준 14569번 C/C++] 시간표 짜기 (0) | 2024.07.29 |
[백준 17135번 C/C++] 캐슬 디펜스 (0) | 2024.07.25 |
[백준 13335번 C/C++] 트럭 (2) | 2024.07.24 |
[백준 13335번 C/C++] 트럭 (0) | 2024.07.21 |
댓글
이 글 공유하기
다른 글
-
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
2024.07.30 -
[백준 14569번 C/C++] 시간표 짜기
[백준 14569번 C/C++] 시간표 짜기
2024.07.29 -
[백준 17135번 C/C++] 캐슬 디펜스
[백준 17135번 C/C++] 캐슬 디펜스
2024.07.25 -
[백준 13335번 C/C++] 트럭
[백준 13335번 C/C++] 트럭
2024.07.24