https://www.acmicpc.net/problem/14503
이 역시도 시뮬레이션 문제.
간단히 문제의 상황을 구현만 해주면 된다.
별다른 어려움은 없는 문제!
#include <stdio.h>
//input이 긴 문제는 일일히 input 치기가 귀찮아서 fopen으로 input을 넣는다.
FILE* in = fopen("input.txt", "r");
int n, m;
int now_x, now_y, now_dir;
int map[51][51];
int turn;
//문제의 조건에 따라 0 북, 1 동, 2 남, 3 서
int dir_x[4] = { -1, 0, 1, 0 };
int dir_y[4] = { 0, 1, 0, -1 };
int dir_num;
// 3 조건인지 4 조건인지 구분
bool possible = true;
// 로봇청소기가 있는 쪽은 무조건 비어있다고 했으니까 한 구역은 무조건 청소
int ans = 1;
int main() {
//입력
fscanf(in, "%d %d", &n, &m);
fscanf(in, "%d %d %d", &now_x, &now_y, &now_dir);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fscanf(in, "%d ", &map[i][j]);
//4 방향 다 돌고, 뒤로 가지도 못해야 함
while (turn < 4 || possible)
{
//로봇청소기가 있는 위치는 청소한 것으로 표시
map[now_x][now_y] = 2;
//왼쪽으로 회전, 북 -> 서 -> 남 -> 동
now_dir = (now_dir + 3) % 4;
// 청소되어있거나 벽이면 turn
if (map[now_x + dir_x[now_dir]][now_y + dir_y[now_dir]] == 1 || map[now_x + dir_x[now_dir]][now_y + dir_y[now_dir]] == 2)
turn++;
// 아니면 그 위치로 가고, 답 + 1, turn 초기화
else
{
now_x = now_x + dir_x[now_dir]; now_y = now_y + dir_y[now_dir];
turn = 0;
ans++;
}
// 4번 다 돌았다면
if (turn == 4)
{
//후진하는 방향
int back_dir = (now_dir + 2) % 4;
//후진하는 방향으로 갔을 때 벽이면 false 반환
if (map[now_x + dir_x[back_dir]][now_y + dir_y[back_dir]] == 1)
possible = false;
//아니면 그곳으로 이동하고 turn 초기화
else
{
now_x = now_x + dir_x[back_dir]; now_y = now_y + dir_y[back_dir];
turn = 0;
}
}
}
//출력
printf("%d", ans);
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 14888번 연산자 끼워넣기 C/C++ 풀이 (0) | 2020.08.09 |
---|---|
백준 15686번 치킨 배달 C/C++ 풀이 (0) | 2020.08.08 |
백준 17144 미세먼지 안녕! C/C++ 풀이 (0) | 2020.08.06 |
백준 14891번 톱니바퀴 C/C++ 풀이 (0) | 2020.08.05 |
백준 3190번 문제 뱀 C/C++ 풀이 (0) | 2020.08.04 |