문제 링크: https://www.acmicpc.net/problem/14503
그냥 써있는대로 풀면 됩니다.
#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};
int wall[50][50];
bool cleaned[50][50];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int n, m, r, c, d;
cin >> n >> m >> r >> c >> d;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> wall[i][j];
// robot
int counter = 0;
int y=r, x=c;
bool end = false;
while (!end) {
if (!cleaned[y][x]) {
cleaned[y][x] = 1;
++counter;
}
while (!end) {
bool all_clean = true;
for (int i = 0; i < 4; ++i) {
if (!wall[y + dy[i]][x + dx[i]] && !cleaned[y+dy[i]][x+dx[i]]) {
all_clean = false;
break;
}
}
// 네 칸 모두 벽 or 청소됨
if (all_clean) {
int back_d = (d + 2) % 4;
// 후진 x
if (wall[y + dy[back_d]][x + dx[back_d]]) {
end = true;
break;
}
y += dy[back_d], x += dx[back_d];
continue;
}
int left_d = (d + 3) % 4; // 왼쪽 방향
if (wall[y + dy[left_d]][x + dx[left_d]] || cleaned[y + dy[left_d]][x + dx[left_d]]) {
d = left_d;
continue;
}
y += dy[left_d], x += dx[left_d];
d = left_d;
break;
}
}
cout << counter << '\n';
return 0;
}
중간에 continue 한개 빼먹어서 삽질을 좀 했네요
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 14430: 자원 캐기 (0) | 2020.07.22 |
---|---|
[백준][C++] 14499: 주사위 굴리기 (0) | 2020.07.22 |
[백준][C++] 17946: 피자는 나눌 수록 커지잖아요 (0) | 2020.07.20 |
[백준][C++] 17953: 디저트 (0) | 2020.07.20 |
[백준][C++] 18234: 당근 훔쳐 먹기 (0) | 2020.07.20 |