문제 : https://www.acmicpc.net/problem/14503
시뮬레이션 문제 중에서도 쉬운 편에 속한다(고 한다... 나한테는 어렵다...)
기본적으로 문제가 주어진 조건에만 유의해서 코드로 옮기면 되는데 다만 방향에 대해서 주의해야 한다.
북 0 동 1 남 2 서 3 으로 주어지고 왼쪽 방향이라고 하면
d = (d + 3) % 4 로 탐색해야 하는데, 문제를 제대로 안읽고 (d + 1) % 4 를 통해 오른쪽 방향으로 탐색 했다.
이 외에는 정말 문제가 주어진 조건에만 유의하여 2-a,b / 2-c,d 조건으로 나눠서 풀면 어렵지 않게 해결이 가능하다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int mp[50][50]; // map
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int main() {
// input
int n, m, x, y, d, ans = 0;
cin >> n >> m;
cin >> x >> y >> d;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> mp[i][j];
while (true) {
// 빈칸
if (mp[x][y] == 0){
mp[x][y] = -1; // 청소
ans++;
}
// 2-a,b 방향 찾기
int cnt = 0;
int nd = d;
for (cnt = 0; cnt < 4; cnt++) {
nd = (nd + 3) % 4; // 다음 방향
int nx = x + dx[nd], ny = y + dy[nd]; // 다음 위치
// 2-a 청소 가능하면
if (mp[nx][ny] == 0) {
x = nx, y = ny, d = nd; // 이동 방향 회전
break; // 다음 이동
}
}
// 2-c,d 방향 없을 경우
if (cnt == 4) {
int nd = (d + 2) % 4; // 반대 방향 후진
int nx = x + dx[nd], ny = y + dy[nd]; // 후진
// 2-d 벽인 경우
if (mp[nx][ny] == 1)
break;
// 아닌 경우
else
x = nx, y = ny; // 후진
}
}
cout << ans;
}
'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글
백준 15683_감시 (0) | 2019.10.17 |
---|---|
백준 14890_경사로 (0) | 2019.10.16 |
백준 14891_톱니바퀴 (0) | 2019.10.15 |
백준 14499_주사위 굴리기 (0) | 2019.10.15 |
프로그래머스_입국심사 (2) | 2019.10.09 |